使用模拟框架和MSPEC时,您在哪里设置存根

Kev*_*ter 3 bdd unit-testing rhino-mocks mspec

我使用MSpec相对较新,因为我编写了越来越多的测试,显然减少重复,你经常需要根据Rob Conery的文章使用基类进行设置

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

我错过了更好的方法吗?

Ale*_*roß 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();
}
Run Code Online (Sandbox Code Playgroud)

当您使用这种类型编写更多测试时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);
        };
}
Run Code Online (Sandbox Code Playgroud)

这为您提供了以下优势:您可以从上下文本身影响存根的返回值:您可以通过在上下文中保留尽可能多的本地信息并为基类中的"setup"方法提供良好的名称来实现此目的.

没有必要指定或期望任何存根相关的内容Because.当Because运行时,您的系统应该是在它无需进一步准备行使的状态.