【发布时间】:2022-01-26 14:13:00
【问题描述】:
假设我有一个带有理论方法的测试类,该方法使用两个输入“无关”和“无关2”运行。测试首先检查是否有静态类“IsInitialized”,如果有,则测试失败。
然后,测试通过调用“Initialize”来初始化静态类。
[Theory]
[InlineData("irrelevant")]
[InlineData("irrelevant2")]
public void Test(string param)
{
if (MyStaticClass.IsInitialized()) { throw new Exception(); }
MyStaticClass.Initialize();
}
public static class MyStaticClass
{
private static bool Initialized = false;
public static void Initialize()
{
Initialized = true;
}
public static bool IsInitialized()
{
return Initialized;
}
}
我希望两个测试都能通过,因为静态类仅在调用“Initialize”后才被初始化。但是,结果是第一次测试通过,第二次失败,因为静态类保留在内存中。我希望静态类状态恢复到初始状态。我可以理解为什么会发生这种情况,因为使用了静态。但是,我试图弄清楚是否有一种方法可以配置测试以释放静态类的内存,就好像我会运行一个新的测试用例一样。
如果我有两个包含相同代码的“事实”,也会发生这种情况。当分别运行每个事实时,两个测试都会通过。运行测试类时,一个会通过(第一个),第二个会失败。
【问题讨论】:
-
这就是为什么您的测试应该独立于副作用的原因。在测试方法中初始化 SUT 所需的一切,不要依赖测试类中的静态值。确保所有测试可以以任何顺序和/或并行运行,以确保您的测试结果稳定。如果你不能确保这一点,那么你就有一个必须修复的设计缺陷。
-
如果我测试静态类本身会怎样?在这种情况下,副作用无关紧要,因为这是测试用例。我用一个新的例子更新了这个问题。
标签: c# unit-testing static xunit