Moq:回调无效。使用参数设置方法不能使用参数调用回调

时间:2013-09-21 00:16:56

标签: moq

我正在尝试使用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 个答案:

答案 0 :(得分:23)

您需要使用该方法所期望的特定类型调用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()的后续调用)似乎是多余的。如果您希望允许模拟的Send调用继续进行,即使它不符合条件,然后在事后验证它,那么您可以改为执行此操作(在调用测试方法之后):

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