Как проверить виртуальное свойство в абстрактном классе с помощью Rhino Mocks и MSpec?
У меня есть виртуальная собственность, FirstName
на абстрактном классе, Foo
, Мне нужно проверить поведение виртуального свойства. Метод никогда не запускается, когда выполняется этот тест (и поэтому тест всегда не выполняется, независимо от того, что находится в теле метода). Как я могу сделать этот метод моей тестируемой системой? Как я могу проверить этот метод?
[Subject(typeof(Foo))]
public class When_whatever
{
Establish context = () =>
{
_fooSut = _mockRepository.PartialMock<Foo>(argumentOne, argumentTwo);
};
Because of = () => _result = _fooSut.FirstName;
It should_return_not_null = () => _result.ShouldNotBeNull();
private static string _result;
private static Foo _fooSut;
}
Я использую Rhino Mocks 3.5 и mspec.
3 ответа
Как создать частичный макет
Вы создаете частичный макет, макет, который реализует абстрактный класс и предоставляет возможности для виртуальных и абстрактных частей класса.
_fooSut = _mockRepository.PartialMock<Foo>(argumentOne, argumentTwo);
И вы называете имущество, которое вы сказали, было виртуальным, FirstName
,
_result = _fooSut.FirstName;
Но вы не заглушаете виртуальный вызов, поэтому он возвращает значение по умолчанию! В этом случае, null
, Вам необходимо добавить этот вызов в ваш контекст.
_fooSut.Stub(x => x.FirstName).Return("Lance");
Как проверить поведение
Ланс, я собираюсь ответить на вопрос the_joric... какое поведение ты пытаешься проверить? Тест, который вы пишете выше, является только тестом, который вы можете настроить макет.
Я могу только начать догадываться, как вы реализуете конкретные классы для этого реферата. Итак, может быть, вы хотите проверить, что каждая реализация предоставляет ненулевое значение для этого свойства? В этом случае вы хотели бы использовать поведение.
[Behaviors]
public class ConcreteFoo
{
It should_set_a_non_null_first_name = () => _fooSut.FirstName.ShouldNotBeNull();
protected static Foo _fooSut;
}
И каждая реализация Foo
может быть проверен на предмет такого поведения.
[Subject(typeof(DefaultFoo))]
public class When_using_a_default_foo
{
Behaves_like<ConcreteFoo> a_concrete_impl_of_foo;
protected static DefaultFoo _fooSut = new DefaultFoo();
}
[Subject(typeof(CustomFoo))]
public class When_using_a_custom_foo
{
Behaves_like<ConcreteFoo> a_concrete_impl_of_foo;
protected static CustomFoo _fooSut = new CustomFoo();
}
Я думаю, что вы должны сделать _mockRepository.ReplayAll()
перед использованием макета. Но в этом случае это должно быть просто выполнено. Кстати, какое поведение вы хотите проверить? Я не думаю, что абстрактная публичная собственность - это хороший дизайн. Не могли бы вы опубликовать свой Foo
класс тоже?