如何验证一个方法是否被调用并且传入了特定类型的参数

15

我需要验证一个方法是否被调用,并且传入了特定类型的对象。

这是我想测试是否被调用的带有该方法的接口:

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异常。

有人知道如何正确处理这个问题吗?

1个回答

16

这是设计上的考虑,你实际上想要做的是:

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

A<?>中指定的类型应始终是方法所需的精确参数类型。实际上,我曾考虑过更改它,以便按您建议的方式限制类型,如果我记得正确,主要原因(但我认为还有其他原因)是在引入重载时它会更加脆弱。

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

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

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


你翻译得很好,我本来就觉得应该有这样的东西,只是在维基百科上找不到。 - Omu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接