我正在设计一个应用程序,它是更大工作的一部分,取决于其他人构建应用程序可以用来检索数据的API。
当我在思考如何设置这个项目并围绕它设计架构时,我发生了一些事情,我相信很多人都处于类似情况。
由于我的工作取决于其他人完成他们的任务和测试服务器,这会减慢我的工作量。
所以问题是: 创建测试存储库和类,实现它们的最佳实践是什么,而不必依赖于更改代码中的多个位置以在测试类和实际存储库/正确的api调用之间进行交换。
考虑以下情况:
GetDataFromApiCommand *getDataCommand = [[GetDataFromApiCommand alloc]init];
getDataCommand.delegate = self;
[getDataCommand getData];
一旦通过API获得数据,“GetDataFromApiCommand”就可以使用实际的API,但在此之前,在调用[getDataCommand getData]
时可以返回一组模拟数据在代码的不同位置可能有多个这样的实例,所以无论它们在哪里都替换它们,这是一个缓慢而痛苦的过程,这不可避免地导致一两个被忽视。
在强类型语言中,我们可以使用依赖注入,只需改变一个地方。 在objective-c中,可以实现工厂模式,但这是最好的途径吗?
GetDataFromApiCommand *getDataCommand = [GetDataFromApiCommandFactory buildGetDataFromApiCommand];
getDataCommand.delegate = self;
[getDataCommand getData];
实现此结果的最佳做法是什么?
由于这将是最有用的,即使你有实际的API可用,运行测试或离线工作,ApiCommands也不一定必须永久替换,而是选择“我想要”使用TestApiCommand或ApiCommand“。
选择在以下选项之间切换更有趣: 所有命令都是测试 和 所有命令都使用live API, 而不是逐个选择它们,但这对于测试一个或两个实际API命令,将它们与测试数据混合也很有用。
修改 我选择这样做的方法是使用工厂模式。
我按如下方式设置工厂:
@implementation ApiCommandFactory
+ (ApiCommand *)newApiCommand
{
// return [[ApiCommand alloc]init];
return [[ApiCommandMock alloc]init];
}
@end
我想在任何地方使用ApiCommand类:
GetDataFromApiCommand *getDataCommand = [ApiCommandFactory newApiCommand];
当需要实际的API调用时,可以删除注释,并可以注释掉模拟。
在消息名称中使用 new 意味着谁曾使用工厂获取对象,负责释放它(因为我们希望避免在iPhone上自动释放)。
如果需要其他参数,工厂需要考虑这些参数 即:
[ApiCommandFactory newSecondApiCommand:@"param1"];
这也适用于存储库。
答案 0 :(得分:1)
在消息名称中使用new意味着谁曾使用工厂获取对象,负责释放它(因为我们想避免在iPhone上自动释放)。
您不必为不自动释放而痴迷。它实际上只适用于您在事件循环的一次迭代中创建大量自动释放对象的情况。如果这个对象的存活期足够长,否则你会将其保留在工厂方法之外,那么返回一个自动释放的对象将只花费你自动释放池中的引用。
无论如何,要回答你的问题,你的选择几乎就是我要做的。还要考虑创建一个与API匹配的Objective-C协议,以及APICommandMock和APICommand必须符合的协议。这将记录API并为您和其他团队提供一些纪律。例如,它会确定方法名称和参数类型等内容。