2017-10-17 81 views
2

我会尽量简化单元测试中遇到的问题。静态值的单元测试

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

问题是,当我有一个以上的单元测试,改变静态值和运行它们。 在这种情况下,只有第一次测试才会通过,其他所有测试都会失败。

这是简化的例子:

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

我会从每一个单元测试期望有静态领域的新的寿命,但是这并不是如此。

+3

这取决于您的单元测试 - ** **选手有实现它为每个测试或没有新的流程,从而新的应用程序域。无论如何,我建议重置静态变量,如果需要反射。 – HimBromBeere

+1

引入像staticValue这样的全局变量是一个糟糕的设计。你能否将TestClass实例化为一个全局可访问的字段?更好,把它放入容器。 – qxg

+0

如果你想测试的代码 - 不使用可变的静态变量,或配置测试跑步者或测试框架运行影响的试验顺序 – Fabio

回答

2

根据单元测试亚军,你可能会或可能不会对每个测试几个过程。所以如果有疑问,我不会过多地指望它,并尝试自行重置静态。

在你的情况下,该成员是你必须使用反射来做到这一点,最好在每testrun建立一个私有字段:

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

正如你看到的初始化有效的测试用例与静是相当哈克和繁琐。如何规避这个问题没有一般的规则。通常static甚至不需要,有时你可以介绍一些你可以模拟的工厂。

+0

是的,这是正确的,只是在我的情况下,我使用的xUnit所以设置使用的构造。 – Raskolnikov