在编写一些 MSpec BDD 测试时,我遇到了一个场景,其中我预计会失败的测试通过了,但只有当我运行所有测试时才通过。当我单独运行测试时,它按预期失败了。经过一番调查后,我发现在第二个测试运行之前,上一个测试中设置的某些状态没有被重置,这导致第二个测试在我预期失败时通过。以下人为的代码重现了该场景:
public class ContextBase
{
protected static object state;
}
public class Context_a : ContextBase
{
Establish context = () => { state = new object(); };
It should_set_state = () => state.ShouldNotBeNull();
}
public class Context_b : ContextBase
{
Establish context = () => { };
It should_set_state = () => state.ShouldNotBeNull();
}
这两个测试都通过了,因为 Context_a 在 Context_b 之前执行,并且在执行 Context_B 时,在 Context_A 中设置的状态仍然设置。如果您单独运行 Context_B,则测试会失败,因为状态尚未设置。有趣的是,如果您从 Context_B 中删除空的 Eastern 语句,那么 Context_B 将始终按预期失败。
我对 MSpec 比较陌生,这种行为让我感到惊讶。我假设这样的状态会在执行每个上下文之间重置。也许我错过了一些东西......我是否正确构建了这些测试?如果 MSpec 不会在上下文之间自动重置这样的状态,那么我应该使用什么策略来确保在像我的示例中那样的情况下重置状态?我是否应该在 ContextBase 类上放置一个 Implement lambda 将所有状态字段设置为 null?
MSpec 不会“重置”执行上下文之间的静态状态。它遵循您从普通静态变量中了解到的行为,即它们不会在应用程序(即测试运行)运行时重新初始化,除非您手动执行此操作。最好初始化中的所有字段Establish
每个上下文。
另一种选择是额外添加一个Establish
在您的基类上,但这将从您的上下文中隐藏重要信息 - 您必须导航到基类才能看到某个字段已使用特定值初始化。但 DRY 不适用于一般测试:我更喜欢使用基类protected static
我从派生上下文调用的方法(请参阅这个答案 https://stackoverflow.com/a/2842244/149264举个例子)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)