Moq: Invalid callback. Setup on method with parameters cannot invoke callback with parameters

You need to call the generic overload of Callback with the specific types expected by the method. The following should work:

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

If the assertions fail in the callback then the test fails immediately, so the call to Verifiable() (and presumably the subsequent call to Verify()) seems to be redundant. If you want to allow the mocked Send invocation to proceed even if it does not meet the criteria and then verify it after the fact, then you can do this instead (after the tested method is invoked):

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

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)