Инициализация/настройка заглушек относится к фазе аранжировки. Фаза аранжировки используется для получения системы в известном состоянии до ее использования.
В 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
, ваша система должна находиться в состоянии, когда ее можно осуществлять без дальнейшей подготовки.
Спасибо, Александр, это имеет смысл. Я надеялся избежать установки контекста в каждом производном классе, но я предполагаю, что это не будет возможно. –
'Потому что 'поля выполняются в правильном порядке, когда вы создаете иерархию классов. Вы можете это сделать, но это не очень хорошая практика. Имейте в виду, что вы хотите хранить как можно больше информации в непосредственной близости от контекста, который выполняется. –