Как я могу обойти выполнение метода в макете RhinoMocks? - PullRequest
3 голосов
/ 08 февраля 2010

Я использую RhinoMocks для очень простого теста (я должен сказать, что я новичок здесь). Я пытался издеваться над моим объектом, как это

var mock = MockRepository.GenerateMock<MyClass>();

создать заглушку помощника:

var stubLinkedObject = MockRepository.GenerateStub<MyClass>();

затем выполните некоторую логику, которая должна вызвать метод AddLink класса MyClass с моим аргументом-заглушкой. В конце теста я просто утверждаю, что этот метод на самом деле вызывался с

mockAction.AssertWasCalled(a => a.AddLink(stubLinkedObject));

Я ввел правильную зависимость, и метод на самом деле вызывается. Однако проблема заключается в том, что реализация real в MyClass вызывается и приводит к сбою, потому что некоторая логика просто не может быть выполнена (сбор ссылок недоступен и т. Д.). Как я могу обойти выполнение и просто проверить, вызывается ли метод? Я пробовал что-то вроде

mockAction.Stub(a => a.AddLink(null)).IgnoreArguments().Do(null);

до того, как я приступлю к выполнению, но это, похоже, не работает (я получаю только некоторые исключения). Любые идеи и, возможно, объяснение, почему макет выполняет логику метода вообще?

Ответы [ 2 ]

4 голосов
/ 08 февраля 2010

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

[Test]
public void Test()
{
    var classMock = MockRepository.GenerateMock<MyClass>();
    var linkedMock = MockRepository.GenerateStub<MyClass>();

    classMock.Expect(c => c.MyMethod(linkedMock));

    classMock.MyMethod(linkedMock);

    classMock.AssertWasCalled(c => c.MyMethod(linkedMock));
}

public class MyClass
{
    public virtual void MyMethod(MyClass linkedClass)
    {
        Console.WriteLine("MyMethod is called");
    }
}
3 голосов
/ 08 февраля 2010

Ваш подход будет работать только в том случае, если ваш метод AddLink является виртуальным, в противном случае среда выполнения .Net всегда будет запускать реальную реализацию (и это правильно).

Обычно рекомендуется использовать интерфейсы при внедрении зависимостей (поэтому ваш класс ожидает IMyClass вместо MyClass). Таким образом, гораздо проще использовать фреймворки для имитации - не только вы не должны помнить, чтобы все методы были виртуальными, но вы также избегаете проблем с передачей правильных аргументов в конструктор MyClass (что в реальном мире является трудной задачей)

...