【发布时间】:2013-08-09 01:55:18
【问题描述】:
好的。我试图弄清楚为什么 MSpec 使用静态方法/变量。 (不完全是静态方法,但使用成员变量委托,实际上是相同的)。
这使得重用上下文变得不可能。或者通过并确保手动重置所有静态变量。这对测试隔离没有强制执行。如果一个测试设置了一些变量,而下一个测试对其进行检查,那么它会在不应该通过的时候通过。
这开始变得非常烦人。我在一个“因为”语句中所做的应该只是停留在那里,而不是仅仅因为它共享相同的上下文而进行所有其他随机测试。
编辑-
问题是,我如何“强制”测试隔离。例如,看看下面的规格,分享FooContext。让我们大胆猜测一下should_not_throw 是否通过?
public class FooContext
{
Establish context = () => Subject = new Foo();
public static Foo Subject;
public static int result;
public static Exception ex;
}
public class When_getting_an_int_incorrectly : FooContext
{
Because of = () => ex = Exception.Catch(() => result = Subject.GetInt(null));
It should_throw = () => ex.ShouldNotBeNull();
}
public class When_getting_an_int_correctly : FooContext
{
Because of = () => ex = Exception.Catch(() => result = Subject.GetInt(0));
It should_not_throw = () => ex.ShouldBeNull();
}
【问题讨论】:
-
尤其是与 XUnit 测试库相比,MSpec 显得一团糟。
-
您的问题,正如所写的那样,有点咄咄逼人。但是,我可以看到您那里有有价值的内容。您的主要关注点是什么: A) 为什么 MSpec 使用自定义委托? B)如何在 MSpec 中重用上下文。或 C)如何在 MSpec 中隔离副作用和全局状态。你也许可以从中得到几个问题。
-
如果您提供一些代码示例来说明您的问题,您可能会得到更有帮助的答案。
-
问题已编辑。添加了示例代码。
-
@AnthonyMastrean C) 我感兴趣的是如何隔离副作用等。