使用Nunit TestCaseSource运行测试设置的正确方法

chr*_*989 4 c# nunit unit-testing testcasesource

我正在尝试使用NUnit中的TestCaseSource运行多个测试。但是我想让[SetUp]在需要时运行。

目前,它可以按我希望的方式工作,但感觉并不“正确”。因此,以下是主要的测试用例代码(简化了):

public class ImportTestCases
{

    ImportTestCases()
    {
        TestData.RunTestSetup();
    }

    public static IEnumerable TestCases
    {
        get
        {
            //run the funciton under test...
            var results = RunFunctionSubjectToTest(TestData.ImportantVar);

            //get multiple results...
            var allProperties =new TestCaseData(o).Returns(true)
                ExpandNestedProperties(results.AllProperties)
                    .ToList()
                    .ConvertAll(o => new TestCaseData(o).Returns(true));

            return allProperties;
        }
    }


}


[TestFixture]
public class ImportTests
{

    [TestFixtureSetUp]
    public void ImporTestSetup()
    {
        TestData.RunTestSetup();
    }

    [Test, TestCaseSource(typeof(ImportTestCases), nameof(ImportTestCases.TestCases))]
    public bool PropertyTest(UnitTestHelper.PropInfo info)
    {
        return info.DoTheyMatch;
    }

}
Run Code Online (Sandbox Code Playgroud)

这里的问题是[SetUp]在ImportTestCases“ TestCases”属性“ get”运行之前没有运行。“ ImportTestCases”的构造函数也未运行。因此,为了确保在引用ImportVar之前已运行“ RunTestSetup”,我必须执行以下操作:

public static class TestData
{
    private static bool HasSetUpRan = false;
    private static int _importantVar;
    public static int ImportantVar
    {
        get
        {
            if(!HasSetUpRan)
            {
                RunTestSetup();
            }
            return _importantVar;
        }
    }        
    public static void RunTestSetup()
    {
        if (HasSetUpRan)
        {
            return;
        }
        ///do set up
        //e.g. _importantVar = GenerateId();
        //end
        HasSetUpRan= true;
    }

}
Run Code Online (Sandbox Code Playgroud)

如您所见,这确保在返回变量之前已运行“设置”。遗憾的是,这是迄今为止我设法使其正常工作的唯一方法。正如我所说,这是“错误的”并且过于复杂。也许我在这里过度使用了testCases?或者我应该使用某种形式的测试用例(可以吗?)。

我已经尝试简化上面的代码,如果对我要测试的内容根本没有意义,则在此道歉。

要点是在创建TestCaseSources之前是否有一个[Setup]运行?

And*_*toy 5

要点是,测试用例将在加载测试时定位。因此,具有[TestFixtureSetUp]属性的例程将在调用“ TestCases ”属性后执行。但是,您可以在静态构造函数中执行一些设置例程。但是为了首先调用它,您需要将测试数据放在同一类中:

[TestFixture]
public class ImportTests
{
    static ImportTests() 
    {
        //Step 1 
        //run your set-up routine
    }

    //Step 3
    [Test, TestCaseSource(nameof(ImportTests.TestCases))]
    public bool PropertyTest(string s) => string.IsNullOrEmpty(s);

    //Step 2
    public static IEnumerable TestCases => new[] {new TestCaseData("").Returns(true)};
}
Run Code Online (Sandbox Code Playgroud)