具有静态值的单元测试

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,有时您可以引入一些可以模拟的工厂。