gpt4 book ai didi

c# - 为什么这个继承的 Establish 会被执行多次?

转载 作者:行者123 更新时间:2023-11-30 12:57:58 27 4
gpt4 key购买 nike

我的理解是每个 Establish 应该只执行一次,但下面的代码显示它执行了多次。我们嵌套类以提供一些分组,同时将 Subject 的单元测试保留在一个文件中。这似乎是一个错误。

我们正在使用 machine.specifications.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
...

这使得在外部类的建立中使用通用设置和覆盖内部类中的特定部分变得容易。就个人而言,在我意识到它以这种方式工作之前,我觉得我正在与 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,在阳光充足的情况下读取传感器
    • (✔) 应该说是晴天
    • (X) 应该返回正确的温度

如果像那个例子一样,所有不同的条件都纯粹来自注入(inject)到 Subject 中的依赖项设置,您甚至可能想将 Because 移到外部类中。然后你就可以在内部类中有一个 Establish 和一些 Its,使每个测试用例都非常简洁。在所有需要的 Establishes 之后和 Its 之前,外部 Because 仍将为每个内部类运行。

关于c# - 为什么这个继承的 Establish 会被执行多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32010702/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com