1

我正在考虑如何实现这一点,似乎我的知识太贫乏而无法理解实现。

我有一个将源代码编译为 DLL 的代码。

然后我需要以某种方式在这个 Dll 上运行单元测试,并检查里面的 3-4 个方法。

我正在尝试以这种方式运行单元测试。

CompilerResults compileResults = codeProvider.CompileAssemblyFromSource(compilerParameters, new string[] { sourceCode });

            Assembly myAssembly = compileResults.CompiledAssembly;

            TestPackage testPackage = new TestPackage(@"TestingProject.dll");
            testPackage.Assemblies.Add(myAssembly);

            RemoteTestRunner remoteTestRunner = new RemoteTestRunner();
            remoteTestRunner.Load(testPackage);
            TestResult testResult = remoteTestRunner.Run(new NullListener(),TestFilter.Empty,false,LoggingThreshold.All);

这例如测试

   [Test]
    public void AddTest(IDynamicScript s)
    {            
        Assert.AreEqual(10, s.Add(5,5));
        Assert.AreNotEqual(10,s.Add(4,5));

    }

由于 Assembly 是动态编译的,我无法将它引用到单元测试项目中,并且它不会编译,请就如何实现这一点提出任何建议

4

1 回答 1

1

经过一些修改后,您的代码可以正常工作。这些是必需的更改:

  • 测试代码需要包装在具有适当命名空间导入的类中,您不能使用 C# 编译器编译独立方法
  • 您需要通知编译器您正在编译的代码的程序集引用,在这种情况下,我提供了nunit.framework.dll程序集的路径,该路径是从主 AppDomain 中加载的副本的位置获取的,但您也可以引用它从文件系统而不加载它。通常您还需要提供包含您正在测试的代码的程序集的路径
  • 类的构造函数TestPackage在其构造函数中采用绝对路径,在这种情况下,我提供了生成程序集的位置

这是带有更正的代码:

var sourceCode = @"
using NUnit.Framework;

public class Fixture
{
    [Test]
    public void AddTest()
    {            
        Assert.AreEqual(10, 5+5);
    }
}";

var provider = new CSharpCodeProvider();

CompilerResults compileResults = provider.CompileAssemblyFromSource(
    new CompilerParameters(new[]{ typeof(TestAttribute).Assembly.Location }), 
    new[]{ sourceCode });

var assembly = compileResults.CompiledAssembly;
var package = new TestPackage(assembly.Location);
var runner = new RemoteTestRunner();

runner.Load(package);

var result = runner.Run(new NullListener(), 
                        TestFilter.Empty, 
                        false, 
                        LoggingThreshold.All);
于 2012-10-31T22:29:18.167 回答