使用 AFNetworking 和 OCMock 的测试网络
Testing network which uses AFNetworking with OCMock
我有一个包含下一个方法的 class 网络:
- (void)fetchRecords {
Network * __weak weakSelf = self;
[self.sessionManager POST:@"" parameters:@{@"parameter":"param1"}
success:^(NSURLSessionDataTask *task, id responseObject) {
[weakSelf setRecordsWithLists:responseObject];
}
failure:nil];
}
属性 sessionManager
是 AFHTTPSessionManager
class。
我想测试我的网络通信。我想检查是否执行了成功块然后调用了 setRecordsWithLists:
方法。
我使用 OCMock,我搜索并编写了下一个测试代码:
- (void)tesNetworkSuccessExecuteSetRecords {
id partiallyMockedSessionManager = [OCMockObject partialMockForObject:self.network.sessionManager];
[[partiallyMockedSessionManager expect] POST:OCMOCK_ANY parameters:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY];
[[[partiallyMockedSessionManager expect] andDo:^(NSInvocation *invocation) {
void (^successBlock)(NSURLSessionDataTask *task, id responseObject);
[invocation getArgument:&successBlock atIndex:4];
successBlock(nil, @[@"first", @"second"]);
}] POST:OCMOCK_ANY parameters:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY];
self.network.sessionManager = partiallyMockedAuthorizationSessionManager;
[self.network fetchRecords];
}
请告诉我如何 return 我自己对成功块的响应,如果做错了。以及如何验证 setRecordsWithLists:
从成功块中调用。
好吧,您实际上设置了两次期望值,这意味着您期望该方法也被调用两次。如果那不是你想要的,你应该删除第一个期望。
另一方面,由于您需要检查您的方法是否被调用,您可能想要为您的 self.network
对象创建一个部分模拟。使用部分模拟(或间谍),您可以使用您喜欢的任何参数为您的方法设置期望,并验证它以完成测试。
您的代码最终应该如下所示:
- (void)tesNetworkSuccessExecuteSetRecords {
id partiallyMockedSessionManager = [OCMockObject partialMockForObject:self.network.sessionManager];
[[[partiallyMockedSessionManager expect] andDo:^(NSInvocation *invocation) {
void (^successBlock)(NSURLSessionDataTask *task, id responseObject);
[invocation getArgument:&successBlock atIndex:4];
successBlock(nil, @[@"first", @"second"]);
}] POST:OCMOCK_ANY parameters:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY];
id spyNetwork = OCMPartialMock(self.network);
[[spy expect] setRecordsWithLists:OCMOCK_ANY];
self.network.sessionManager = partiallyMockedAuthorizationSessionManager;
[self.network fetchRecords];
[spyNetwork verify];
}
同样,您可以在期望中添加您喜欢的参数。注意方法的名称,它应该以 'test' 开头,否则它可能不是 运行 或被 XCode.
识别为测试
我有一个包含下一个方法的 class 网络:
- (void)fetchRecords {
Network * __weak weakSelf = self;
[self.sessionManager POST:@"" parameters:@{@"parameter":"param1"}
success:^(NSURLSessionDataTask *task, id responseObject) {
[weakSelf setRecordsWithLists:responseObject];
}
failure:nil];
}
属性 sessionManager
是 AFHTTPSessionManager
class。
我想测试我的网络通信。我想检查是否执行了成功块然后调用了 setRecordsWithLists:
方法。
我使用 OCMock,我搜索并编写了下一个测试代码:
- (void)tesNetworkSuccessExecuteSetRecords {
id partiallyMockedSessionManager = [OCMockObject partialMockForObject:self.network.sessionManager];
[[partiallyMockedSessionManager expect] POST:OCMOCK_ANY parameters:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY];
[[[partiallyMockedSessionManager expect] andDo:^(NSInvocation *invocation) {
void (^successBlock)(NSURLSessionDataTask *task, id responseObject);
[invocation getArgument:&successBlock atIndex:4];
successBlock(nil, @[@"first", @"second"]);
}] POST:OCMOCK_ANY parameters:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY];
self.network.sessionManager = partiallyMockedAuthorizationSessionManager;
[self.network fetchRecords];
}
请告诉我如何 return 我自己对成功块的响应,如果做错了。以及如何验证 setRecordsWithLists:
从成功块中调用。
好吧,您实际上设置了两次期望值,这意味着您期望该方法也被调用两次。如果那不是你想要的,你应该删除第一个期望。
另一方面,由于您需要检查您的方法是否被调用,您可能想要为您的 self.network
对象创建一个部分模拟。使用部分模拟(或间谍),您可以使用您喜欢的任何参数为您的方法设置期望,并验证它以完成测试。
您的代码最终应该如下所示:
- (void)tesNetworkSuccessExecuteSetRecords {
id partiallyMockedSessionManager = [OCMockObject partialMockForObject:self.network.sessionManager];
[[[partiallyMockedSessionManager expect] andDo:^(NSInvocation *invocation) {
void (^successBlock)(NSURLSessionDataTask *task, id responseObject);
[invocation getArgument:&successBlock atIndex:4];
successBlock(nil, @[@"first", @"second"]);
}] POST:OCMOCK_ANY parameters:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY];
id spyNetwork = OCMPartialMock(self.network);
[[spy expect] setRecordsWithLists:OCMOCK_ANY];
self.network.sessionManager = partiallyMockedAuthorizationSessionManager;
[self.network fetchRecords];
[spyNetwork verify];
}
同样,您可以在期望中添加您喜欢的参数。注意方法的名称,它应该以 'test' 开头,否则它可能不是 运行 或被 XCode.
识别为测试