Как проверить виртуальное свойство в абстрактном классе с помощью 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 ответа

Решение

Ты пытался PartialMock особенность? Посмотреть здесь

Как создать частичный макет

Вы создаете частичный макет, макет, который реализует абстрактный класс и предоставляет возможности для виртуальных и абстрактных частей класса.

_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 класс тоже?

Другие вопросы по тегам