Как проверить виртуальное свойство в абстрактном классе с помощью Rhino Mocks и MSpec? - PullRequest
1 голос
/ 13 июля 2011

У меня есть виртуальное свойство, 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 ]

0 голосов
/ 14 июля 2011

Я думаю, вы должны сделать _mockRepository.ReplayAll() перед использованием макета.Но в этом случае это должно быть просто выполнено.Кстати, какое поведение вы хотите проверить?Я не думаю, что абстрактная публичная собственность - это хороший дизайн.Не могли бы вы также опубликовать свой Foo класс?

0 голосов
/ 27 июля 2011

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

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

_fooSut = _mockRepository.PartialMock<Foo>(argumentOne, argumentTwo);

И вы называете имущество, которое, как вы сказали, было виртуальным , FirstName.

_result = _fooSut.FirstName;

Но вы не заглушаете виртуальный вызов, поэтому он возвращает значение по умолчанию! В этом случае null. Вам нужно добавить этот вызов в ваш контекст.

_fooSut.Stub(x => x.FirstName).Return("Lance");

Как проверить поведение

Лэнс, я собираюсь попугай the_joric * вопрос 1019 * ... Какое поведение вы пытаетесь проверить ? Тест, который вы пишете выше, только проверяет, что вы можете настроить макет.

Я могу только начать догадываться, как вы реализуете конкретные классы для этого реферата. Итак, может быть, вы хотите проверить, что каждая реализация предоставляет ненулевое значение для этого свойства? В этом случае вы хотели бы использовать поведение .

[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();
}
0 голосов
/ 13 июля 2011

Вы пробовали функцию PartialMock? Смотрите здесь

...