Как проверить, что метод был вызван с аргументом определенного типа
Мне нужно убедиться, что метод был вызван с объектом определенного типа
это интерфейс с методом, который я хочу проверить, чтобы он был вызван:
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);
}
Как только вы введете эту перегрузку, ваш тест изменит смысл.