RhinoMocks AssertWasCalled для метода имитируемого объекта, который должен вернуть объект?

При использовании RhinoMocks у меня возникает ловушка-22: я хочу убедиться, что метод вызывается, но этот метод должен иметь возвращаемый объект, потому что возвращенный объект обрабатывается в следующей строке. Другими словами, насмешка над интерфейсом просто возвращает нулевое значение, но отсутствие насмешки не дает мне никакого способа убедиться, что метод был вызван, кроме какого-то интеграционного теста.

Поэтому, глядя на надуманный образец ниже, который я собрал вместе, есть ли способ сделать то, что я хочу? Я думал, что может быть способ заставить метод AssertWasCalled фактически возвращать что-то, как при заглушке метода, но... спасибо за любые указатели (особенно если это просто недостаток дизайна, который следует устранить вместо этого).

public class SomeClass
{
    private readonly ISomeMapper _someMapper;
    [Inject]
    public Test(ISomeMapper someMapper)
    {
        _someMapper = someMapper;
    }

    public SomeReturnType SomeMethod(IEnumerable<ISomethingToMap> somethings)
    {
        //foreach over somethings and do something based on various properties for each

        MappedSomething mappedSomething = _someMapper.Map(something); // AssertWasCalled here
        mappedSomething.SomeProperty = somethingFromSomewhere; // Which gets a null reference exception here (understandably) if _someMapper is mocked
        //end foreach after more stuff
    }

}

  ///...
    [Test]
    public void the_mapper_should_be_called()
    {
        //If mock or stub, then can AssertWasCalled, but then only null object returned.
        // If don't mock, then cannot assert whether was called.
        var mapper = MockRepository.GenerateStub<ISomeMapper>();

        var somethingToMap = _someListOfSomethings[0];

        var sut = new SomeClass(mapper);

        sut.SomeMethod(_someListOfSomethings);

        mapper.AssertWasCalled(x => x.Map(somethingToMap));
    }

person Ted    schedule 07.01.2010    source источник


Ответы (1)


Вы можете установить ожидание для фиктивного объекта, что метод был вызван вместе с возвращаемым значением:

MappedSomething fakeMappedSomething = //whatever
mapper.Expect(m => m.Map(something)).Return(fakeMappedSomething);
...
sut.SomeMethod(_someListOfSomethings);

Затем проверьте ожидания в конце теста.

person Lee    schedule 07.01.2010
comment
Как обычно кажется, это очевидное первое решение, которое я пробовал, но каким-то образом не смог точно реализовать. Попробовал еще раз, и мы золотые. Спасибо! - person Ted; 08.01.2010