具有静态值的单元测试

时间:2017-10-17 07:42:58

标签: c# unit-testing xunit

我会尝试简化单元测试的问题。

我正在使用静态私有字段测试方法。如果我运行测试,那么我必须能够预测静态字段的值。当我有一个测试,或者我逐个运行测试时,这不是问题。比一切都运转正常。

问题是当我有多个单元测试更改静态值并运行它们时。 在这种情况下,只有第一次测试通过而其他所有测试都会失败。

这是一个简化的例子:

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;
        }
    }
}

我希望每个单元测试都有静态字段的新生命周期,但事实并非如此。

1 个答案:

答案 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通常不需要,有时您可以引入一些可以模拟的工厂。