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);
        };
}

これにより、コンテキスト自体からスタブの戻り値に影響を与えることができるという利点が得られます。これを行うには、できるだけ多くの情報をコンテキストのローカルに保持し、基本クラスの「setup」メソッドに適切な名前を付けます。

でスタブ関連を指定したり期待したりする必要はありませんBecause。を実行するBecauseと、システムはそれ以上の準備なしで実行できる状態になっているはずです。

于 2010-03-29T20:40:58.863 に答える