【问题标题】:Run unit tests on dynamically created DLL在动态创建的 DLL 上运行单元测试
【发布时间】:2012-10-20 03:34:21
【问题描述】:

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

我有一个将源代码编译为 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是动态编译的,我不能将它引用到单元测试项目中,并且它不会编译,请对如何实现这一点提出任何建议

【问题讨论】:

    标签: unit-testing dynamic reflection nunit


    【解决方案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);
    

    【讨论】:

    • Simone 感谢您的回答,但不幸的是,这不是我想要实现的目标。你的代码向我指出了如何完成它的新想法,但我想问你更多的事情。
    • 我需要做的是让我们的 QA 经理为我们的系统编写测试脚本,我给他们一个带有 TextArea 代码的模板,他们将编写 C# 的“测试脚本”方法,他们在 TextArea 中编写代码,然后我将他们的代码动态编译为程序集,并且我希望能够在此程序集上运行我之前准备的单元测试,因此需要将程序集“注入”到单元测试中
    • 但再次感谢您的回复,它为我指明了我今天将尝试实施的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2016-06-21
    • 2020-10-14
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多