Подтвердить что ты не робот

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

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

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

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

Кто-нибудь знает, как это сделать правильно?

4b9b3361

Ответ 1

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

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

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

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

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

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