无法验证对具有多个接口的模拟对象上的方法的调用

Unable to verify a call to a method on the mocked object with multiple interface

我正在尝试为 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()
   }
}

我在这里返回实现了 ITranslatorIPolicyAwareTranslator

PolicyTranslator

ITranslator 分别有 Translate()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() 实例不会匹配测试时传递的任何内容