使用 AFNetworking 和 OCMock 的测试网络

Posted

技术标签:

【中文标题】使用 AFNetworking 和 OCMock 的测试网络【英文标题】:Testing network which uses AFNetworking with OCMock 【发布时间】:2015-06-05 12:22:29 【问题描述】:

我有一个包含下一个方法的类网络:

- (void)fetchRecords 
Network * __weak weakSelf = self;
[self.sessionManager POST:@"" parameters:@@"parameter":"param1"
                               success:^(NSURLSessionDataTask *task, id responseObject) 
    [weakSelf setRecordsWithLists:responseObject];

                               failure:nil];

属性sessionManagerAFHTTPSessionManager 类。 我想测试我的网络通信。我想检查是否执行成功块然后调用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];

如果做错了,请告诉我如何返回我自己的成功块响应。以及如何验证setRecordsWithLists: 是从成功块调用的。

【问题讨论】:

【参考方案1】:

好吧,您实际上设置了两次期望,这意味着您期望该方法也被调用两次。如果这不是你想要的,你应该删除第一个期望。

另一方面,由于您需要检查您的方法是否被调用,您可能希望为您的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识别为测试。

【讨论】:

以上是关于使用 AFNetworking 和 OCMock 的测试网络的主要内容,如果未能解决你的问题,请参考以下文章

xcode 中的单元测试(使用 GHUnit 和 OCMock)

OCMock 和 UIViewController

使用 OCMock 和 MagicalRecord 进行单元测试

使用 OCMock 进行 OSX 应用程序测试

OCMock 3 Partial Mock:类方法和 objc 运行时

GHUnit,OCMock:如何测试两个指定块之一是不是被调用?