首页 新闻 搜索 专区 学院

单元测试的方法中,有对Redis进行数据增删改的操作,如何过滤掉方法内的Redis操作(避免影响实际Redis中的数据)

0
悬赏园豆:200 [已解决问题] 解决于 2020-11-05 14:55

使用的单元测试框架是xunit,想通过单元测试,测试新增数据方法A(),但是A()中增加成功后,有更新Redis的操作,请问这种情况有什么办法可以避免更新Redis吗?

念丶冰的主页 念丶冰 | 初学一级 | 园豆:2
提问于:2020-10-08 16:17
< >
分享
最佳答案
0

大哥呀, 你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();
}
收获园豆:200
czd890 | 大侠五级 |园豆:9524 | 2020-10-09 16:01

谢谢回答,这个代码也是当初尝试的,确实没用上,因为IpBlackListAppService这个类是通过GetRequiredService<IIpBlacklistAppService>();获取的注入实例,然后这个类中的想测试的方法是个无参的,就是说mock出来的redis无法通过参数传进去,就是因为这样,就不太理解这种操作如何mock出来

念丶冰 | 园豆:2 (初学一级) | 2020-10-09 16:26

@念丶冰: 如果你的_ipBlackListAppService对象是从DI获取的,那你在_ipBlackListAppService里面用到的redis对象哪里来的?如果也是DI注入的, 那在初始化servicecollection的时候吧redis对象add为一个mock对象就可以了.

czd890 | 园豆:9524 (大侠五级) | 2020-10-09 17:03

@czd890: 不好意思,这个Redis对象是直接硬编码new出来的,不是注入的,所以这个方式也不行,我之前也想过,最开始也是使用的注入,后面由于某些原因不得已才用的new,这种情况还有救吗

念丶冰 | 园豆:2 (初学一级) | 2020-10-09 17:05

@念丶冰: 看ms fakes的例子,上面的回复

czd890 | 园豆:9524 (大侠五级) | 2020-10-09 17:22
其他回答(2)
0

Mock 一个操作 redis 的实现

dudu | 园豆:38814 (高人七级) | 2020-10-08 18:01
0

redis也应该是测试的一部分吧,可以专门部署个测试环境redis吗

会长 | 园豆:9555 (大侠五级) | 2020-10-12 09:31

单元测试中的一些中间件有些时候没有测试需求,我这目前就是,就是想默认任务Redis是可靠的,只验证其中的业务逻辑部分

支持(0) 反对(0) 念丶冰 | 园豆:2 (初学一级) | 2020-10-13 09:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册