具有静态值的单元测试

Ras*_*kov 4 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Him*_*ere 5

根据unittest-runner,您可能会或可能不会在每个测试中都有多个过程。因此有疑问,我不会过多依靠它,而是尝试自行重置静态变量。

在您的情况下,由于成员是私有字段,因此必须使用反射来完成此操作,理想情况下,是设置每个测试运行:

[Setup]
public void SetupTest()
{
    var field = typeof(TestClass).GetField("staticValue", BindingFlags.Static | BindingFlags.NonPublic);
    if(field != null)
        field.SetValue(null, 0);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,使用静态变量初始化有效的测试用例非常麻烦且麻烦。没有通用的规则来规避这一点。通常static甚至不需要这些东西,有时您可以引入一些可以嘲笑的工厂。