При использовании 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));
}