标签:接口编程 依赖 单元 影响 dem ima 怎样 面向 生命周期
这里创建一个类 Product 代表商品; ProductCollection 代表配送的商品集合, DistributeProduct 方法根据传入的商品 Id 集合代表需要配送的商品(具体看项
目代码)
创建一个基于 Framework 的单元测试项目 MyUnitTestApplication ,添加一个单元测试类 ProductCollectionTests , ,添加一个单元测试方
法 ProductCollction_DistributeProduct_Test
在单元测试的方法体内右键运行单元测试,如下图所示,可以在右侧测试资源管理器中看到看到运行结果;例如把第三个断言修改成一个错误的结果,右
键运行单元测试,就会出现测试未通过显示。
这样一个最简单的单元测试就写完了,假如将来有人修改了 DistributeProduct 方法,再将这个单元测试运行一遍就可以验证修改是否存在 Bug.
的是它的 ToNotice 方法向外部发送通知消息。所以这里的 ProductCollection 对象依赖于 DistributeNotice 对象。但是,一般向外部发送信息需要 一些配置以
及 第三方的代理类(外部依赖)。例如如下图所示: DirstributeNotice 对象依赖着 ConfigurationManager 和 EmailSend 。此时单元测试已经不能进行了,因为需
要考虑其他的外在因素。
我们的解决方案是:此时我们可以添加一个 间接层。让原本依赖于 类或者 外部资源的对象抽象成依赖于它们的 接口,然后通过接口动态生成一个模拟的实现
类。(这也是设计原则中所谓的 面向接口编程)于是我们的依赖关系变为下图:
基于接口重写编写单元测试,这里我们用到了 Mock 接口单元测试,使用了开源的 Mock 框架 NSubstitute 。(测试过程中替代真实对象的内存级别虚
拟对象)
法的业务逻辑呢?例如下图所示:我们在我们的 ProductCollection 集合类中添加一个方法 ValidatorProduct , ,根据产品的编号,判断产品的数量和价格是否合适,从而
判断这个产品是否合适。在编写方法过程中,我们遵循单一职责原则,将验证逻辑碎片化以备将来扩展和重用,但是这些逻辑都是重要逻辑,我们想
要测试它们,然而我们只有一个公共的方法入口 ValidatorProduct ,我们不能单独的测试其中一个的逻辑。
此时我们的解决方案是:我们可以在测试环境下,提供一个继承于测试类的子类,在子类中提供这些方法的可测试版本。如下图所示:我们建立了一个子
类 ProductCollectionAccessibility , ,通过继承的方式,在 ValidatorPriceAccessibility 方法中和 ValidatorNumberAccessibility 分别测试父类的验证产品价格和数
量的方法。
我们经常需要完善我们的测试用例,
单元测试,基于一个测试用例很完善的单元测试项目,我们修改后,只需要将单元测试重新运行一遍,就可以保证重构修改代码是否有 Bug ,是否有副作
用。
标签:接口编程 依赖 单元 影响 dem ima 怎样 面向 生命周期
原文地址:https://www.cnblogs.com/liumengchen-boke/p/9315625.html