Как проверить, что метод был вызван с аргументом определенного типа

Мне нужно убедиться, что метод был вызван с объектом определенного типа

это интерфейс с методом, который я хочу проверить, чтобы он был вызван:

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 ответ

Решение

Это по замыслу, то, что вы пытаетесь сделать, это на самом деле:

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

Тип, указанный в A, Всегда должен быть точным типом параметра, который принимает метод. Я действительно рассматривал возможность его изменения, чтобы вы могли ограничить тип так, как вы предлагаете, и если я правильно помню, главная причина (но я думаю, что были и другие причины) состояла в том, что он будет более хрупким в тех случаях, когда вы вводите перегрузки.

Например, предположим, что вы ввели следующую перегрузку в интерфейсе IPlayer:

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

Как только вы введете эту перегрузку, ваш тест изменит смысл.

Другие вопросы по тегам