Rhino Mocks Stub разные экземпляры по возвращении - PullRequest
4 голосов
/ 24 июня 2011

Я ищу способ сделать мои тесты более понятными, вот в чем проблема:

public interface A
{

}

public interface B
{
    A GetA();
}

Теперь, если я хочу заглушку на B и новый экземпляр каждый раз, когда я вызываю GetA, я делаю это:

[Test]
public void TestName()
{
     MockRepository mockery = new MockRepository();

     B b = mockery.Stub<B>();
     b.Stub(x => x.GetA()).Return(mockery.Stub<A>()).Repeat.Once();
     b.Stub(x => x.GetA()).Return(mockery.Stub<A>()).Repeat.Once();

     mockery.ReplayAll();

     Assert.IsFalse(ReferenceEquals(b.GetA(), b.GetA()));
}

Обратите внимание, что в assert я дважды вызываю GetA, и я настроил результаты как Repeat.Once () вместо Repeat.Twice ();

Если вы запустите этот тест, он пройдет, потому что экземпляры разные. Однако, я не нахожу этот код очень ясным таким образом. Как заставить Rhino Mocks генерировать новый экземпляр при каждом вызове?

Примечание: В прошлом я использовал много трюков, например, при каждом возврате, используя Do () для выполнения некоторого кода, который изменяет экземпляр и тому подобное, но есть ли что-то вроде .GenerateNewInstance () или аналогичный?

Ответы [ 2 ]

5 голосов
/ 24 июня 2011
[Test]
public void TestName()
{
      var b = MockRepository.GenerateStub<B>();
      b.Stub(x => x.GetA())
          .WhenCalled(x => x.ReturnValue = MockRepository.GenerateStub<A>());

      Assert.IsFalse(ReferenceEquals(b.GetA(), b.GetA()));
}

В некоторых случаях вы должны явно добавить вызов .Return(), но значение будет переопределено, если вы установите ReturnValue в аргументе делегата WhenCalled.

2 голосов
/ 24 июня 2011

Я разбил много пота по этому вопросу. Это можно сделать так, как описано в моем ответе по этой ссылке , но я пришел к выводу, что зачастую будет гораздо проще пропустить Rhino и создать собственную фиктивную реализацию.

...