Ответ 1
Вам нужно вызвать общую перегрузку Callback с конкретными типами, ожидаемыми методом. Должно работать следующее:
sender.Setup(x => x.SendCommand(It.IsAny<MyCommand>(), false))
.Callback<ICommand, bool>((command, idFromContent) =>
{
var myCommand = command as MyCommand;
Assert.That(myCommand, Is.Not.Null);
Assert.That(myCommand.Id, Is.EqualTo(cmd.Id));
Assert.That(myCommand.Name, Is.EqualTo(cmd.Name));
})
.Verifiable();
Если утверждения не срабатывают в обратном вызове, тогда тест немедленно завершится, поэтому вызов Verifiable() (и, предположительно, последующий вызов Verify()) представляется избыточным. Если вы хотите разрешить посмеянный вызов отправки, даже если он не соответствует критериям, а затем проверить его после факта, вы можете сделать это вместо этого (после вызова метода проверки):
sender.Verify(x => x.SendCommand(It.Is<MyCommand>(c =>
{
Assert.That(c, Is.Not.Null);
Assert.That(c.Id, Is.EqualTo(cmd.Id));
Assert.That(c.Name, Is.EqualTo(cmd.Name));
return true;
}), false), Times.Once());