Используя RhinoMocks, у меня возникает ситуация catch-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));
}