我正在尝试为 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()
}
}
我在这里返回实现了 ITranslator
和 IPolicyAwareTranslator
的 PolicyTranslator
ITranslator
有 Translate()
而 IPolicyAwareTranslator
有 SetPolicy(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/