c# - 无法验证对具有多个接口的模拟对象上的方法的调用
问题描述
我正在尝试为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()
}
}
在这里,我将返回PolicyTranslator
which 实现ITranslator
和IPolicyAwareTranslator
ITranslator
有Translate()
而IPolicyAwareTranslator
有SetPolicy(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);
解决方案
需要放松参数匹配器
mockedPolicyTranslator.Verify(t => t.SetPolicy(It.IsAny<UnknownPolicy>()), Times.AtLeastOnce);
因为当前使用的new UnknownPolicy()
实例不会匹配测试时传递的任何内容
推荐阅读
- python - 有没有办法检查 PyQt5 中的菜单选项是否更改?
- linux - 在 bash 脚本的 if 语句中使用 traceroute
- php - 获取所有文本,但不获取正则表达式匹配
- javascript - pupeteer 调试:查找哪一行导致错误
- java - 用于在 Java 中将 .txt 文件转换为 .csv 的解析器
- mysql - 在 MariaDB 中使用许多 UPDATE 监视 SQL 脚本的进度
- ruby-on-rails - 捆绑安装时的 Ruby Gem LoadError
- google-play - Play Store:如果应用程序是免费的但服务 api 是付费的,我们是否需要向 Google 付费
- cors - 使用 jamesdbloom/MockServer 将 PATCH 添加到 CORS 的问题
- autohotkey - 如何在特定条件下扩展字符串?