Moq: недопустимый обратный вызов. Setup on method with parameters не может вызывать обратный вызов с параметрами

Я пытаюсь использовать moq для написания модульного теста. Вот мой код модульного теста

        var sender = new Mock<ICommandSender>();
        sender.Setup(m => m.SendCommand(It.IsAny<MyCommand>(), false))
              .Callback(delegate(object o)
              {
                  var msg = o as MyCommand;
                  Assert.AreEqual(cmd.Id, msg.Id);
                  Assert.AreEqual(cmd.Name, msg.Name);
              })
              .Verifiable();

SendCommand принимает объект и необязательный логический параметр. И MyCommand происходит от ICommand.

void SendCommand(ICommand commands, bool idFromContent = false);

когда тест выполняется, я вижу ошибку

System.ArgumentException : Invalid callback. Setup on method with parameters (ICommand,Boolean) cannot invoke callback with parameters (Object).

Я хочу проверить, является ли содержание сообщения тем,что я отправил. Я искал форум и нашел несколько различных вариантов этой проблемы, но это не помогло. Любая помощь очень оцененный.

1 ответов


вам нужно вызвать общую перегрузку обратного вызова с конкретными типами, ожидаемыми методом. Должно работать следующее:

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());