我正在尝试使用 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;
}
}
这里的问题是 [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;
}
}
如您所见,这可确保在返回变量之前设置已运行。可悲的是,这是迄今为止我设法让它工作的唯一方法。正如我所说,感觉“错误”并且过于复杂。也许我在这里过度使用了测试用例?或者我应该使用某种参数化的测试用例(这可能吗?)。
我试图简化上面的代码,如果我试图测试的内容根本没有意义,我深表歉意。
要点是在创建 TestCaseSources 之前是否有一个 [Setup] 运行?