将字符串转换为C#代码

时间:2010-01-07 07:02:47

标签: c# nunit nunit-2.5

在当前的NUnit版本中,我可以参数化TestFixture并多次实例化它。例如:

[TestFixture("var1")]  
[TestFixture("var2")]  
[TestFixture("var3")]  
public class MyTestFixture  
{  
    private string var;  

    public MyTestFixture(string var)  
    {  
        this.var = var;  
    }  

    ...  

}  

这将使用参数参数实例化MyTestFixture 3次。我的问题是当前的NUnit没有TextFixture属性的数据源功能(只有TestCaseSource)。我需要根据数据输入实例化TestFixture,每个TestFixture都有一组不同的测试用例数据输入。由于TestCaseSource,测试用例数据驱动没问题。但是我如何为TestFixture属性执行此操作?

我的想法是动态生成TestFixture属性,然后将其更改为代码字符串并插入到测试代码中,例如:类似这样的内容:

ConvertToCode(GenerateTestFixture());  
public class MyTestFixture  
{  
   ...  
}  

我该怎么做?或者有更好的方法吗?

非常感谢你的帮助。

最好的问候,
爱德华

3 个答案:

答案 0 :(得分:3)

可以动态地为您的方法创建属性,但很难。你最好找另一种方法。

当您的代码被编译并自动插入代码时,编译器会读取您所拥有类型的属性(例如[TestFixture])。

要为类生成自己的属性,您需要使用Reflection.Emit之类的东西来修改生成的程序集作为项目的构建后步骤。这就像直接编写汇编语言(你将创建MSIL),这可能很有趣但不容易,并且会使你的代码很难维护!

另一种方法可能是让枚举控制测试用例,并有一个方法来检查枚举并返回适当的数据:

public enum TestController
{
    Value1,
    Value2,
    Value3
}

[TestFixture(TestController.Value1)]   
[TestFixture(TestController.Value2)]   
[TestFixture(TestController.Value3)]   
public class MyTestFixture   
{   
    public MyTestFixture(TestController testController)   
    {   
        var dataForTest = GetDataForTest(testController);
    }   

    ...   

}   

然后方法GetDataForTest()会有某种switch语句来生成数据。

另一种方法可能是使用类型而不是枚举,然后在GetDataForTest()方法中实例化类型并调用工厂方法 - 但我认为这可能有点过于复杂。

答案 1 :(得分:0)

看看那里:

http://www.dotnetspider.com/resources/26499-Making-NUnit-test-cases-data-driven.aspx

[TestCaseSource]和TestCaseData是您正在寻找的类

答案 2 :(得分:0)

现在可以在NUnit 3.x中使用TestFixtureSource属性。创建一个使用您的值实现IEnumerable的类,然后像这样使用它:

[TestFixtureSource(typeof(Foo), Category = "Quux")]
public class BarTest
{    
     public BarTest(object baz)
     {
         _baz = baz;
     {
}

使用TestCaseSource改变并适用于TestFixtureSource的一件事是,你必须给它一个实现IEnumerable的类型或给它一个静态方法。如果您依赖于从构造函数生成数据的属性或方法,那么您需要以静态方式重构,或者让类实现IEnumerable本身并将其自身作为源类型传递。