首页 > 解决方案 > 无法验证对具有多个接口的模拟对象上的方法的调用

问题描述

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

在这里,我将返回PolicyTranslatorwhich 实现ITranslatorIPolicyAwareTranslator

ITranslatorTranslate()IPolicyAwareTranslatorSetPolicy(Policy policy)分别。现在,对于单元测试,我创建了一个 MockITranslator并进行了设置,然后我IPolicyTranslator通过 As<> 创建了 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);

标签: c#unit-testingmoq

解决方案


需要放松参数匹配器

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

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


推荐阅读