14

我需要验证是否使用特定类型的对象调用了方法

这是我要测试它被调用的方法的接口:

interface IPlayer
{
   void Send(object message);
}

考试:

var player1 = A.Fake<IPlayer>();
room.AddPlayer(player1);

room.DoSomething();

A.CallTo(() => player1.Send(A<Type1>.Ignored)).MustHaveHappened();

因为player1.Send我得到了许多不同对象的多次调用InvalidCastException

有人知道如何正确地做到这一点吗?

4

1 回答 1

15

这是设计使然,您实际上要做的是:

A.CallTo(() => player1.Send(A<object>.That.IsInstanceOf(typeof(MessageType)))).MustHaveHappened();

A<?> 中指定的类型应该始终是方法采用的确切参数类型。实际上,我确实考虑过更改它,以便您可以按照建议的方式限制类型,如果我没记错的话,主要原因(但我认为还有其他原因)是在引入重载的情况下它会更加脆弱。

例如,假设您在 IPlayer 接口上引入了以下重载:

interface IPlayer
{
   void Send(object message);
   void Send(Type1 message);
}

一旦你引入了这个重载,你的测试就会改变意义。

于 2012-07-23T07:39:03.117 回答