3

我对使用 MSpec 比较陌生,随着我编写越来越多的测试,很明显可以减少重复,根据Rob Conery 的文章,您经常必须使用基类进行设置

我很高兴使用 AssertWasCalled 方法来验证我的期望,但是您在哪里设置存根的返回值,我发现在注入我的依赖项的基类中设置上下文很有用,但是(我认为)意味着我需要在因为感觉委托中设置我的存根。

我错过了更好的方法吗?

4

1 回答 1

7

存根的初始化/设置属于排列阶段。安排阶段用于在您使用之前让系统进入已知状态。

在 MSpec 中,排列阶段是在Establish字段中执行的。例如:

public class When_the_temperature_threshold_is_reached
{
    static ITemperatureSensor Sensor;
    static Threshold Threshold;

    Establish context = () =>
        {
            Sensor = MockRepository.GenerateStub<ITemperatureSensor>();
            Sensor
                .Stub(x => x.GetTemperature())
                .Return(42);

            Threshold = new Threshold(Sensor);
        };

    Because of = () => Reached = Threshold.IsReached(40);

    It should_report_that_the_threshold_was_reached =
        () => Reached.ShouldBeTrue();
}

当您使用这种类型编写更多测试时ITemperatureSensor,您应该提取一个执行复杂或重复设置的基类。

public abstract class TemperatureSpecs
{
    protected static ITemperatureSensor CreateSensorAlwaysReporting(int temperature)
    {
        var sensor = MockRepository.GenerateStub<ITemperatureSensor>();
        sensor
            .Stub(x => x.GetTemperature())
            .Return(temperature);

        return sensor;
    }
}

public class When_the_temperature_threshold_is_reached : TemperatureSpecs
{
    // Everything else cut for brevity.
    Establish context = () =>
        {
            Sensor = CreateSensorAlwaysReporting(42);

            Threshold = new Threshold(Sensor);
        };
}

这为您提供了一个优势,即您可以从上下文本身影响存根的返回值:您可以通过将尽可能多的信息保留在上下文中并为基类中的“设置”方法提供一个好名称来做到这一点。

无需在Because. 运行时Because,您的系统应处于无需进一步准备即可运行的状态。

于 2010-03-29T20:40:58.863 回答