C# 最低起订量;验证呼叫失败

C# 最低起订量;验证呼叫失败,c#,unit-testing,mocking,moq,verify,C#,Unit Testing,Mocking,Moq,Verify,我已经为我的记录器创建了一个模拟项,以便我可以验证对它进行了哪些调用;像这样: mock_log.Setup(l => l.InfoFormat(It.IsAny<string>(), It.IsAny<object[]>())); mock_log.Verify(m => m.InfoFormat("1 file(s) found that match criteria."), Times.Exactly(1)); 只有一个文件被传递下来 那么为什

我已经为我的记录器创建了一个模拟项,以便我可以验证对它进行了哪些调用;像这样:

  mock_log.Setup(l => l.InfoFormat(It.IsAny<string>(), It.IsAny<object[]>()));
  mock_log.Verify(m => m.InfoFormat("1 file(s) found that match criteria."), Times.Exactly(1));
只有一个文件被传递下来

那么为什么当我验证一个调用失败时?
任何建议。

在模拟设置中,您告诉记录器第二个参数是数组,但随后在运行时传入一个计数。我想这就是问题所在。尝试更改为:

It.IsAny()


另一个想法是,你申请的测试。验证看起来有点奇怪。我不确定时间是什么。确切地说(1)是要做的,如果mock试图运行验证结果格式字符串,您可能只想传入1

发现这是因为插入的字符串无法接通。将验证更改为

 mock_log.Verify(m => m.InfoFormat("{0} file(s) found on Ftp server.", 4), Times.Exactly(1));

如果删除安装调用,会发生什么情况?我认为您正在设置Moq,以期待2次呼叫-设置和验证。我更喜欢使用Setup进行精确调用,并使用moq.VerifyAll()检查设置是否已被使用。无需调用Setup,因为您正在验证感兴趣的调用。有些人使用VerifyAll设置,但根据我的经验,我同意RussellAllen的观点,即这种方法可能是一个
params object[]
参数,因此它是一个数组。是的,它是一个params object[],因此设置是正确的。事实证明,它是调用的精确表示,而不是外推版本。只是为了提醒大家不要随意使用
it.IsAny
。在评论和回答中有一个关于它的使用的讨论,OP认为这很有帮助。还有一个提示,您可以使用
次。一次
而不是
次。确切地说(1)
。您必须验证所拨打电话的准确签名。请记住,模拟框架不知道您正在模拟的方法将等效于字符串格式。它所知道的是,方法的特定签名是使用某些参数调用的。如果您的测试代码使用扩展方法,这可能会变得很棘手,因为您必须验证实际发出的调用。
 mock_log.Verify(m => m.InfoFormat("{0} file(s) found on Ftp server.", 4), Times.Exactly(1));