我会尝试简化单元测试的问题。
我正在使用静态私有字段测试方法。如果我运行测试,那么我必须能够预测静态字段的值。当我有一个测试,或者我逐个运行测试时,这不是问题。比一切都运转正常。
问题是当我有多个单元测试更改静态值并运行它们时。 在这种情况下,只有第一次测试通过而其他所有测试都会失败。
这是一个简化的例子:
using Xunit;
namespace My.Unit
{
public class UnitTests
{
[Fact]
public void test1()
{
var obj = new TestClass();
var res = obj.testMethod();
Assert.Equal(1, res);
}
[Fact]
public void test2()
{
var obj = new TestClass();
var res = obj.testMethod();
Assert.Equal(1, res);
}
}
public class TestClass
{
private static int staticValue = 0;
public TestClass()
{
++staticValue;
}
public int testMethod()
{
return staticValue;
}
}
}
我希望每个单元测试都有静态字段的新生命周期,但事实并非如此。
答案 0 :(得分:3)
根据unittest-runner的不同,每次测试都可能有也可能没有多个进程。所以毫无疑问,我不会指望太多,并试图自己重置静态。
在你的情况下,由于成员是一个私人领域,你必须使用反射来做到这一点,理想情况下是设置每个testrun:
[Setup]
public void SetupTest()
{
var field = typeof(TestClass).GetField("staticValue", BindingFlags.Static | BindingFlags.NonPublic);
if(field != null)
field.SetValue(null, 0);
}
正如您所看到的那样,使用静态函数初始化有效的测试用例非常麻烦且繁琐。没有一般规则如何规避这一点。通常static
通常不需要,有时您可以引入一些可以模拟的工厂。