1

我最近一直在尝试在我的代码中添加一些(逻辑)单元测试。我已经用Kiwi设置了测试,我喜欢 BDD 风格和语法。

我现在的问题是我正在尝试测试一些依赖于CLLocationManager发送正确locationManager:didUpdateToLocation:fromLocation:. 但是,当我运行测试时,这从未发生过,大概是因为CLLocationManager认为它未经授权。作为记录,我已将.gpx文件添加到测试目标并编辑方案以使用该文件作为位置(在Edit Scheme... -> Test -> Info下)。当我在模拟器中运行完整的应用程序时,相同的代码可以正常工作。知道如何在测试用例中发送(模拟)位置更新吗?

4

2 回答 2

4

使用依赖注入来指定您想要使用的位置管理器。您可以:

  • 将其指定为初始化程序的参数(构造函数注入)
  • 将其设置为属性(setter 注入)

如果可以,请尝试使用构造函数注入。

然后为了真正的使用,传入一个真正的 CLLocationManager。但是对于测试使用,提供一个可以触发发送所需方法的假,并带有预设的测试参数。通过删除对您的实际位置的任何引用,这也使您的测试具有确定性。

于 2013-02-06T03:44:27.127 回答
1

我最终选择了另一种方式:我将逻辑测试转换为应用程序测试,以便测试实际上与模拟器中的应用程序一起运行。这具有明确的优势,即我不必费力地获得[NSBundle mainBundle]CLLocationManager像在应用程序中一样工作。我更喜欢单独逻辑测试的概念清洁度,但我认为仅仅为此重写代码是没有意义的。

于 2013-02-06T12:35:34.397 回答