在编写单元测试时我还是个新手,我经常遇到这样的情况,我不知道什么是正确的做事方式。为计划中的设计编写测试我遇到了其中一个引起头皮屑的实例。我的设计:
一个 ViewController 根据用户的输入将消息发送到 dataFetcherClass。(以下代码已更改以保护无辜者)。
-(void) userPushedLocalBusinessButtons{
[_businessDataFetcher fetchLocalData];
}
-(void) userPushedWorldwideBusinessButtons{
[_businessDataFetcher fetchWorldwideData];
}
这些操作的数据格式相同,它是 dataFetcher 应该从更改中收集数据的位置。所以,在 BusinessDataFetcherClass 我有这些方法:
-(void) fetchLocalData{
_dataAddress = @"localData.json";
[self fetchData];
}
-(void) fetchWorldwideData{
_dataAddress = @"worldwideData.json";
[self fetchData];
}
fetchData 方法异步获取数据,并在完成后发送包含收集到的数据的通知。现在,我想编写单元测试,检查在执行 fetchLocalData 或 fetchWorldwideData 时 ivar _dataAddress 是否已更改。
如果不更改代码,这显然是不可能的。有人会说,这可以通过将 _dataAddress 设置为公共属性来轻松解决,这是一种解决方案。另一种方法是创建一个返回 _dataAddress ivar 值的方法。我对这两种选择都不完全满意,因为它们在两种情况下都迫使我只为测试更改代码,而不是提高实际代码库本身的整体质量。
我选择了第二种选择,并包含了一个方法 -(NSString *) dataAddress; 我的问题(如标题中所述)是这样是否可以?我的设计有问题吗?显然,TDD 的首要目标是避免回归,但我相信提高整体代码质量也是一个重要目标。是否会添加偶尔的绒毛?