我的理解是每个Establish
应该只执行一次,但下面的代码显示它执行了多次。我们嵌套类以提供一些分组,同时将主题的单元测试保留在一个文件中。这似乎是一个错误。
我们使用 machine.specations.runner.resharper Reshaper 扩展和 MSpec 0.9.1。
[Subject(typeof(string))]
internal class EstablishRunTwice {
Establish sharedContext = () => Console.WriteLine("Shared context");
internal class ScenarioA : EstablishRunTwice {
Establish scenarioAContext = () => Console.WriteLine("ScenarioA context");
internal class ScenarioAVariation1 : ScenarioA {
Because of = () => Console.WriteLine("ScenarioAVariation1 Because");
It it1 = () => Console.WriteLine("ScenarioAVariation1 It1");
It it2 = () => Console.WriteLine("ScenarioAVariation1 It2");
}
internal class ScenarioAVariation2 : ScenarioA {
Because of = () => Console.WriteLine("ScenarioAVariation2 Because");
It it1 = () => Console.WriteLine("ScenarioAVariation2 It1");
It it2 = () => Console.WriteLine("ScenarioAVariation2 It2");
}
}
internal class ScenarioB : EstablishRunTwice {
Establish context = () => Console.WriteLine("ScenarioB context");
Because of = () => Console.WriteLine("ScenarioB Because");
It it1 = () => Console.WriteLine("ScenarioB It1");
It it2 = () => Console.WriteLine("ScenarioB It2");
}
}
ScenarioAVariation1 的结果如下:
Shared context
Shared context
ScenarioA context
Shared context
Shared context
ScenarioA context
ScenarioAVariation1 Because
ScenarioAVariation1 It1
ScenarioAVariation1 It2
当我们使用 NUnit 构建自己的自定义上下文规范框架时,我们通过确保所有子类都是抽象的(在本例中,EstablishRunTwice 和 ScenarioA 将是抽象的)来解决 NUnit 运行的问题,但尝试这样做时 MSpec 会抛出错误。
这是因为您既嵌套又继承了测试类。通常,您可能纯粹出于组织目的在 C# 中使用嵌套类,但它也会对 MSpec 中的执行产生影响。这可能出乎意料,但确实符合其声明式风格。事实上,通常不需要为 MSpec 使用继承,除非您在不同文件之间重用功能。
只需删除示例中的继承并保留嵌套,您将看到输出为:
Shared context
ScenarioA context
ScenarioAVariation1 Because
ScenarioAVariation1 It1
ScenarioAVariation1 It2
...
这使得在外部类的Establish中使用通用设置并覆盖内部类中的特定部分变得很容易。就我个人而言,在我意识到它以这种方式工作之前,我觉得我正在与 MSpec 争夺依赖于不同设置的测试用例(与将不同值直接传递给“Because”中的主题的测试用例相比)。
假设你有一个天气传感器,你可以这样构造它:
[Subject(typeof(WeatherSensor))]
class when_reading_the_sensor : WithSubject<WeatherSensor> {
Establish context = () => { common setup }
class with_sunny_conditions {
Establish context = () => { setup sunny conditions }
Because of = () => Subject.Read();
It should_say_it_is_sunny => () => ...
It should_return_correct_temps => () => ...
}
class with_rainy_conditions {
...
}
}
测试结果也很好地体现了这一点。鉴于第二个测试失败,它可能在测试树中显示如下:
- (X) WeatherSensor, when reading the sensor with sunny conditions
如果,如该示例所示,所有不同的条件纯粹来自于注入到主题中的依赖项的设置,您甚至可能希望将because移动到外部类中。然后你可以在内部类中只包含一个Established和一些Its,使得每个测试用例都非常简洁。在所有需要的Establish 之后和Its 之前,外部Because 仍然会为每个内部类运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)