c# - 无法验证对具有多个接口(interface)的模拟对象上的方法的调用

标签 c# unit-testing moq

我正在尝试为 TranslateResponse() 编写单元测试。

private async Task TranslateResponse(Policy policy)
{
  foreach(t in translatorFactory.BuildTranslator())
  {
    var policyTranslator=t as IPolicyAwareTranslator;
    policyTranslator?.SetPolicy(policy);
  }
}

虽然 TranslateResponse() 还有许多其他翻译器,但现在,我将其限制为只有一个。 BuildTranslator

public async Task<List<ITranslator>> BuildTranslators()
{
   return new List<ITranslator>()
   {
     new PolicyTranslator()
   }
}

我在这里返回实现了 ITranslatorIPolicyAwareTranslatorPolicyTranslator

ITranslatorTranslate()IPolicyAwareTranslatorSetPolicy(Policy policy)。 现在,对于单元测试,我创建了一个 ITranslator 的 Mock 并进行了设置,然后我通过 As<> 创建了 IPolicyTranslator 的 Mock。

Mock<ITranslator> mockedTranslator=new Mock<ITranslator>();
mockedTranslator.Setup(t => t.Translate(_translatorDataAccessor.Object));

var mockedPolicyTranslator = mockedTranslator.As<IPolicyAwareTranslator>();
mockedPolicyTranslator.Setup(t => t.SetPolicy(It.IsAny<Policy>()));

List<ITranslator> translators = new List<ITranslator>(new List<ITranslator>() { mockedTranslator.Object });
translatorFactory.Setup(t => t.BuildTranslators(It.IsAny<string>())).ReturnsAsync(translators);

验证调用仍然失败。 我是朝着正确的方向前进还是遗漏了什么?

mockedPolicyTranslator.Verify(t => t.SetPolicy(new UnknownPolicy()), Times.AtLeastOnce);

最佳答案

需要放宽参数匹配器

mockedPolicyTranslator.Verify(t => t.SetPolicy(It.IsAny<UnknownPolicy>()), Times.AtLeastOnce);

因为当前使用的 new UnknownPolicy() 实例不会匹配测试时传递的任何内容

关于c# - 无法验证对具有多个接口(interface)的模拟对象上的方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58999349/

相关文章:

c# - Moq Controller 测试重复设置

c# - 实例化并初始化多维数组 C#

unit-testing - 在 Azure DevOps 上,我找不到解释如何作为 .NET Core 构建管道的一部分自动运行单元测试项目的示例

ios - PromiseKit 没有回调/解除分配? (阿拉莫菲尔)

java - 测试调用具有不同参数类型的同一类的相似方法的方法的最佳实践是什么?

c# - Moq 和 xUnit 的单元测试失败 - InvalidOperationException

c# - WPF DataGrid 和 ScrollViewer 性能低下

c# - 当前上下文中不存在名称 '...'

c# - MVC 4 - Html.Partial() 显示 DIV 内的 System.Namespace 文本(出现在页面上的 html 中)

c# - 无法获取模拟对象的方法以返回假数据