是否有任何OnTimeSetUp属性可以接受NUnit中的参数?

时间:2018-09-05 12:56:41

标签: c# unit-testing nunit

我有一个单元测试项目,其中包含所有平台的所有测试。但是根据平台类型,我需要在测试用例中进行检查。例如,如果我有这样的内容:

[TestCase]
public void Do_Sth_ExpectSth()
{
    //Arrange
    //....
    //Act
    //....
    //Assert
    if(TestPlatform.IsMainLine)
    {
        Assert.That(...); //assert something based on MainLine platform
    }
    else
    {
        Assert.That(.....); // assert something else for non mainline platforms
    }
}

我可以通过在TestCase(...)属性中传递PlatformType枚举来测试每个平台,但是在某个时候,我认为只对全局配置一次平台类型,并在项目中针对每种平台类型运行每个测试。

所以,我可能会遇到这样的事情:

[SetUpFixture]
public class GlobalSetup
{
    [OneTimeSetUp(PlatformType.MainLine)]
    [OneTimeSetUp(PlatformType.Other)]
    public void Configure(PlatformType platform) 
    {
        TestPlatform.SetPlatform(platform);
        //other stuff
    }

    [OneTimeTearDown]
    public void Reset() 
    {
        //reset
    }
}

这将对我有帮助,因为每个单元测试都将在特定的平台类型下运行,但是在大多数情况下,我不必更改每种平台类型的代码并再次运行测试项目(喜欢)。因此,我在考虑是否有一种OneTimeSetUp属性可以接受参数,然后针对不同的参数重新运行每种测试方法。我宁愿选择此方法,也不愿在每种测试方法中都设置PlatformType,因为我会根据平台类型在全局范围内进行一些自动映射器配置。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

OneTimeSetUpAttribute仅具有默认构造函数,因此无法传递参数。此外,相同的方法不可能一次标记两次。可以在两种不同的方法上使用两次该属性,但是在这种情况下,它们都被称为同一夹具。

另一种方法是向SetUpFixtureAttribute提供参数。该功能不可用,但与NUnit处理TestFixtureAttribute的方式一致。假设,NUnit可以创建SetUpFixture多次,并将参数存储(在某个地方)并由其下的固定装置访问,该参数也可以多次创建。这是添加到NUnit的重要功能,但是您可以请求它。

没有这种功能,您最好的办法是对每个需要它们的TestFixture使用相同的参数...

[TestFixture(PlatformType.Mainline)]
[TestFixture(PlatformType.Other)]
public class MyTestFixture
{
    private PlatformType _platform;

    public MyTestFixture(PlatformType platform)
    {
        _platform = platform;
    }

    ...
}

如果不想在每个类中都重复此操作,则可以对在多个平台上运行的测试使用基类,将属性放在基类上。除非您有很多这样的类,否则我自己的倾向是重复属性,因为这样会使人们更容易阅读代码以了解发生了什么。