Ik probeer een mapping-interface IMapper
te bespotten:
public interface IMapper {
TBar Map(TFoo foo);
TFoo Map(TBar bar);
}
In mijn test, zet ik de mock mapper op om een aanroep van elk te verwachten (rondom een NHibernate update
bewerking):
//...
_mapperMock.Setup(m => m.Map(fooMock.Object)).Returns(barMock.Object);
_mapperMock.Setup(m => m.Map(barMock.Object)).Returns(fooMock.Object);
//...
Wanneer de tweede Map
aanroep wordt gedaan, gooit de mapper mock omdat het slechts één aanroep verwacht.
Terwijl ik tijdens het instellen tijdens runtime kijk naar de mapper, kan ik kijken hoe de Map (TFoo foo)
overload wordt geregistreerd en zie je hem vervangen wanneer de Map (TBar bar)
overbelasting is ingesteld.
Is dit een probleem met de manier waarop Moq setup afhandelt of is er een andere syntax die ik in dit geval moet gebruiken?
EDIT
Here is the actual instantiation code from the test constructor:
public class TestClass {
private readonly MockRepository _repository = new MockRepository(MockBehavior.Strict);
public TestClass() {
//...
_mapperMock = _repository.Create
>();
//...
}
}
EDIT 2
Hier is een volledig falende testcase:
public interface IMapper {
TFoo Map(TBar bar);
TBar Map(TFoo foo);
}
public class Foo {
public override int GetHashCode() {
//return base.GetHashCode();
return 1;
}
}
public class Bar {
public override int GetHashCode() {
//return base.GetHashCode();
return 2;
}
}
[Test]
public void TestIt()
{
//Arrange
var _mapperMock = new Mock>(MockBehavior.Strict);
var fooMock = new Mock();
var barMock = new Mock();
_mapperMock.Setup(m => m.Map(fooMock.Object)).Returns(barMock.Object);
_mapperMock.Setup(m => m.Map(barMock.Object)).Returns(fooMock.Object);
//Act - breaks on first line below this comment
var bar = _mapperMock.Object.Map(fooMock.Object);
var foo = _mapperMock.Object.Map(barMock.Object);
//Assert
_mapperMock.Verify(x => x.Map(fooMock.Object), Times.Once());
_mapperMock.Verify(x => x.Map(barMock.Object), Times.Once());
}
Als ik de GetHashCode()
negeren op Foo
of Bar
, of op beide, de testcase doorgeeft. Of, als ik Mock
s van Foo
en Bar
niet gebruik, wordt de testcase doorgegeven.
EDIT 3
I opened Moq Issue 347 against this problem, with more detailed test cases.