具有静态值的单元测试
Unit test with static value
我将尝试简化我在单元测试中遇到的问题。
我正在使用静态私有字段测试方法。如果我 运行 进行测试,那么我必须能够预测静态字段的值是多少。当我有一个测试时,或者如果我 运行 一项一项地测试,这不是问题。然后一切正常。
问题是当我有多个更改静态值的单元测试并且 运行 全部更改时。
这样的话只有第一个测试通过,其他的都失败。
这是简化的示例:
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;
}
}
}
我希望每个单元测试都有新的静态字段生命周期,但事实并非如此。
根据 unittest-runner 的不同,您可能会或可能不会在每个测试中有多个进程。所以有疑问我不会太依赖它并尝试自己重置静力学。
在您的情况下,由于成员是私有字段,您必须使用反射来执行此操作,最好是在设置每个测试运行时:
[Setup]
public void SetupTest()
{
var field = typeof(TestClass).GetField("staticValue", BindingFlags.Static | BindingFlags.NonPublic);
if(field != null)
field.SetValue(null, 0);
}
如您所见,使用静态初始化有效测试用例非常麻烦且麻烦。没有如何规避这一点的一般规则。通常甚至不需要 static
,有时您可以引入一些可以模拟的工厂。
我将尝试简化我在单元测试中遇到的问题。
我正在使用静态私有字段测试方法。如果我 运行 进行测试,那么我必须能够预测静态字段的值是多少。当我有一个测试时,或者如果我 运行 一项一项地测试,这不是问题。然后一切正常。
问题是当我有多个更改静态值的单元测试并且 运行 全部更改时。 这样的话只有第一个测试通过,其他的都失败。
这是简化的示例:
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;
}
}
}
我希望每个单元测试都有新的静态字段生命周期,但事实并非如此。
根据 unittest-runner 的不同,您可能会或可能不会在每个测试中有多个进程。所以有疑问我不会太依赖它并尝试自己重置静力学。
在您的情况下,由于成员是私有字段,您必须使用反射来执行此操作,最好是在设置每个测试运行时:
[Setup]
public void SetupTest()
{
var field = typeof(TestClass).GetField("staticValue", BindingFlags.Static | BindingFlags.NonPublic);
if(field != null)
field.SetValue(null, 0);
}
如您所见,使用静态初始化有效测试用例非常麻烦且麻烦。没有如何规避这一点的一般规则。通常甚至不需要 static
,有时您可以引入一些可以模拟的工厂。