スタブの初期化/セットアップは、アレンジ フェーズに属します。調整フェーズは、システムを実行する前に、システムを既知の状態にするために使用されます。
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
と、システムはそれ以上の準備なしで実行できる状態になっているはずです。