Формулировать как общие, так и специальные методы-заглушки? - PullRequest
2 голосов
/ 15 августа 2010

чтобы протестировать другой класс, я хочу создать заглушку для интерфейса IFoo :

public interface IFoo
{
    int DoSomething(int value);
}

Заглушка создана в SetUp (или TestInitialize ) - метод для тестового устройства и сохраненный в свойстве, поскольку почти все методы тестирования нуждаются в IFoo :

this.Foo = MockRepository.GenerateStub<IFoo>();

Поскольку IFoo.DoSomething нуждается вчтобы вернуть переданное значение во всех случаях, кроме одного, я добавил это поведение в свой метод SetUp :

this.Foo.Stub(f => f.DoSomething(0)).IgnoreArguments().Return(0).WhenCalled(mi => mi.ReturnValue = mi.Arguments[0]);

Теперь, однако, этот один тест требует другого поведения: Вместо того, чтобы возвращать переданный аргумент, константа должна быть возвращена, если переданное значение равно другой константе.Следующий подход (записанный в самом методе теста) работает , а не :

this.Foo.Stub(f => f.DoSomething(42)).Return(43);

Предыдущий указанный более общий заглушка, кажется, переопределяет более конкретную заглушку.
Есть лиесть ли способ указать как специфические, так и общие заглушки для RhinoMock-объектов?

Один из обходных путей - воссоздание заглушки в самом тестовом методе - дублирование, которое я хотел бы избежать.Однако я мог бы жить с этой версией.
Что я также не хочу, так это явное исключение «42» в общем выражении через ограничения, поскольку это отрицательно повлияет на другие тесты.
Вызов BackToRecord тоже не вариант, так как, похоже, сбрасывает и другие заглушки.

Спасибо за ваши ответы!

Ответы [ 2 ]

1 голос
/ 15 августа 2010

Я не думаю, что возможно «сбросить» ожидания.В этом случае я бы не стал настраивать этот макет в настройках, вместо этого я бы создал метод, который бы легко его настраивал и вызывал из каждого теста:

private IFoo SetUpFoo()
{
  IFoo foo = MockRepository.GenerateStub<IFoo>();
  foo.Stub(f => f.DoSomething(0)).IgnoreArguments().Return(0).WhenCalled(mi => mi.ReturnValue = mi.Arguments[0]);
}

Затем просто используйте этот метод в каждом тестекоторый требует стандартного foo:

[Test]
public void StandardTest()
{
  IFoo foo = SetUpFoo();
  ...
}

, в вашем особом случае вы должны создать foo вручную и настроить ожидание:

[Test]
public void SpecialTest()
{
  IFoo foo = MockRepository.GenerateStub<IFoo>();
  foo.Stub(f => f.DoSomething(42)).Return(43);
  ...
}

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

0 голосов
/ 15 августа 2010

Я только что нашел решение для «переопределения» заглушек / ожиданий: Rhino Mocks: Как очистить предыдущие ожидания от объекта?

Применительно к моей проблеме теперь я могу написать:

this.Foo.Stub(f => f.DoSomething(42)).Return(43).Repeat.Any();

В документации к Any говорится:

Повторите метод любое количество раз.Это имеет особые последствия в том смысле, что этот метод теперь игнорирует упорядочивание.

Так что, похоже, это не ошибка или недокументированная функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...