如何使用FakeItEasy为每次调用使用不同的参数多次调用假对象的方法?

时间:2014-07-11 00:18:04

标签: unit-testing mocking tdd fakeiteasy

我目前正在使用FakeItEasy进行单元测试。我假装NServiceBus .Send方法调用是在一个方法中进行的。

我遇到的问题是我在方法中发送了两条消息:

bus.Send(new CommandOne(Id = [something]));
bus.Send(new CommandTwo(Id = [something]));

两个命令都在伪造的总线上以相同的方法调用发送(为了简单起见,我删除了真正的命令名称和参数)。

以下是我的NUnit代码/ FakeItEasy代码:

bus = A.Fake<IBus>;
var sut = new Sut(bus);
sut.MethodCall();

A.CallTo(() => bus.Send(A<CommandOne>.That.Matches(co => co.Id == [someId]).MustHaveHappened(Repeated.Exactly.Once);
A.CallTo(() => bus.Send(A<CommandTwo>.That.Matches(co => co.Id == [someId]).MustHaveHappened(Repeated.Exactly.Once);

但是,当我运行此测试时,我得到一个测试失败的结果,说明:

System.InvalidCastException : Unable to cast object of type 'CommandTwo' to type 'CommandOne'.

当我发送两个不同的命令起诉相同的假,我指定特定的对象类型和命令的属性匹配,但FakeItEasy正在尝试转发第一个命令被发送(CommandOne),两个秒命令发送(CommandTwo)...

有没有办法使用FakeItEasy来测试同一个被调用两次伪造对象的方法,每个调用具有不同的值?

谢谢, 麦克

1 个答案:

答案 0 :(得分:2)

您的问题听起来非常像Issue 326 - Argument Constraints should support derived types as Type Arguments,最近已在FakeItEasy release 1.22.0中修复。如果您未使用该版本,请升级并查看该行为是否仍然存在。 如果 使用1.22.0,请回来评论,以便我们继续尝试!