自从我开始使用TDD以来,我一直坚信,这是一种很好的方式来编写符合正确模式的代码,而不会强迫我做出设计决定。 我发现这在80%的情况下是正确的,但是当涉及到测试某些特定的对象时出现问题,这些对象出于某种原因在实现中包装并隐藏了一个对象。Objective-C中的TDD:属性/构造函数注入还是方法混合?
给你举个例子,让我们觉得MyLocationManager使用对象赋予一个通用的接口,我的对象,以及NSLocationManager内套。 当我想测试这样一个对象时,我必须提供一个模拟NSLocationManager。
我当然有属性/构造函数注入方法,但这意味着添加一个属性或构造函数参数,我只想隐藏其他对象的对象:我创建了MyLocationManager以包装并隐藏NSLocationManager,为什么我应该公开一个属性只是为了测试它?
我已经找到一种方法,这是非常简单的方法来调酒NSLocationManager的方法,这样我就可以交换的实际实施情况,模拟一个方法,但这似乎相当不干净,我不知道它是多么安全。
据我所知,Demeter Law的违规行为可能不会公开财产构造函数,但另一方面,我认为在objective-c中,这种模式的一些灵活性是可以接受的。
所以我的问题是,应该有什么办法我没有清楚地看到要采用属性/构造函数注入,还是方法swizzling是一种常用的做法?
是否有任何其他技术适用于此方案,我应该更好地使用?
脚注: 即使包装网络代码和类的对象(如NSUrlSession),此问题也是如此。
如果不在生产代码中包含此测试头文件,这怎么可能? –
我不明白这个问题。你说过“为什么我应该公开财产来测试它?”。它是带测试或无测试的产品代码!? –