当我们进行软件开发时,一般会写单元测试,而对于业务情景来说,一般是测试它的业务逻辑准确性,对于你的测试数据是否来自数据库还是文件,是否为真实还是模拟,并不是很关心!我关心的就是我的业务逻辑是否正确!
所以我们的单元测试在调用底层接口时,尤其是数据持久层的接口时,一般可以使用mock的方式,即模拟一个接口,期望的参数和期望的结果就够了,而没有必要真正去连接数据库,事实上,在业务测试里,使用真实的数据库没有什么意义!无非是加大测试的复杂度!
一个不错的mock测试工具 Moq,它在nuget上已经有了正式版,大家可以下载使用
下面介绍如何使用这个工具,我们以一个最简单的例子来说一下,例如有一个接口,里面一个方法,方法有输入参数和返回值,我们可以这样去模拟它的实现!
一个标准的接口,它的实现可能是从数据库返回一个集合,而在测试用例里,我只使用moq来干这事,你完全可以不写它的实现,先进行业务代码编写,这就是TDD!
public interface IReport_BalanceStatementDao { IEnumerable<BalanceSheetReport> GetClosingBalance(int companyId, DateTime relateDate); }
测试用例可以这样去设计
_report_BalanceStatementDao = new Moq.Mock<IReport_BalanceStatementDao>(); _report_BalanceStatementDao.Setup(p => p.GetClosingBalance(270, new DateTime(2017, 10, 31))).Returns(() => { return _balanceSheetReportList; }); _report_BalanceStatementDao.Setup(p => p.GetClosingBalance(270, new DateTime(2017, 9, 30))).Returns(() => { return _balanceSheetReportList; }); _balanceStatementService = new BalanceStatementService(_report_BalanceStatementDao.Object);
运行你的测试用例,我们事实上并不GetClosingBalance是否实现,我们只关心它的输入参数和返回值,只要业务层调用它时,输入参数匹配它就可以返回遇期的结果!这才是
最重要的事!
感谢各位的阅读!
CI、CD我们还在继续!
本文转自博客园张占岭(仓储大叔)的博客,原文链接:DotNetCore跨平台~Moq框架实现模拟测试,如需转载请自行联系原博主。