大哥呀, 你mock的redis都没用上啊........., 好歹也是
var target = new IpBlackListAppService(redisMock.Object);
target.GetListAsync();
或者用ms fakes来替换. 参考:https://docs.microsoft.com/en-us/visualstudio/test/using-shims-to-isolate-your-application-from-other-assemblies-for-unit-testing?view=vs-2019
// code under test
public static class Y2KChecker {
public static void Check() {
if (DateTime.Now == new DateTime(2000, 1, 1))
throw new ApplicationException("y2kbug!");
}
}
//unit test code
// create a ShimsContext cleans up shims
using (ShimsContext.Create()) {
// hook delegate to the shim method to redirect DateTime.Now
// to return January 1st of 2000
ShimDateTime.NowGet = () => new DateTime(2000, 1, 1);
Y2KChecker.Check();
}
谢谢回答,这个代码也是当初尝试的,确实没用上,因为IpBlackListAppService这个类是通过GetRequiredService<IIpBlacklistAppService>();获取的注入实例,然后这个类中的想测试的方法是个无参的,就是说mock出来的redis无法通过参数传进去,就是因为这样,就不太理解这种操作如何mock出来
@念丶冰: 如果你的_ipBlackListAppService对象是从DI获取的,那你在_ipBlackListAppService里面用到的redis对象哪里来的?如果也是DI注入的, 那在初始化servicecollection的时候吧redis对象add为一个mock对象就可以了.
@czd890: 不好意思,这个Redis对象是直接硬编码new出来的,不是注入的,所以这个方式也不行,我之前也想过,最开始也是使用的注入,后面由于某些原因不得已才用的new,这种情况还有救吗
@念丶冰: 看ms fakes的例子,上面的回复
Mock 一个操作 redis 的实现
redis也应该是测试的一部分吧,可以专门部署个测试环境redis吗
单元测试中的一些中间件有些时候没有测试需求,我这目前就是,就是想默认任务Redis是可靠的,只验证其中的业务逻辑部分