在单元测试中使用AFNetworking监视可达性失败

时间:2015-10-22 09:42:50

标签: objective-c unit-testing afnetworking-2 reachability ocmock

在我正在开展的项目中,我实施了HTTP Manager Reachability示例。

当我运行实际应用时,它会进入块内并从那里进入交换机:

[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {

此外,当我调用...reachabilityManager] isReachable时,方法会按预期返回true。

当我尝试单元测试我编写的使用...reachabilityManager] isReachable作为前提条件的类方法时出现问题 - 它返回false并且在调试期间我注意到了什么是奇怪的它没有进入上面的区块,它会跳过它。

当然,在实际应用程序中,它会进入块内。

我甚至试图在单元测试中使用OCMock来模拟实现HTTP Manager Reachability示例的类,但它给了我相同的结果:

// NetworkClass implements the example
NetworkClass *networkClass = [[NetworkClass alloc] init];
id mockedNetworkClass = OCMPartialMock(networkClass);
// startNetworkMonitoring method implements the whole example above
[mockedNetworkClass startNetworkMonitoring];
// Giving enough time for AFNetworking to finish
[NSThread sleepForTimeInterval:60.0f];

EDIT1:

看起来信号量/ XCTestExpectation无法提供帮助,问题出在 AFNetworkReachabilityManager :: startMonitoring

  • 我们可以获得所需回调的唯一方法是在dispatch_async(dispatch_get_main_queue(), ^{ callback(status);
  • 内的 startMonitoring 方法内

但即使我们使用所提到的信号量/ XCTestExpectation,它也会在单元测试之外运行。

仍在寻找灵魂......

EDIT2:

我试图关注objc.io 测试异步代码,但似乎缺少一些代码,而且有些解释缺乏集成细节。

1 个答案:

答案 0 :(得分:1)

我认为睡眠线程会导致问题。

尝试使用Writing Tests of Asynchronous Operations中记录的期望API。

有些事情应该让你开始(注意这更多的是期望API的演示,而不是一个完整的工作测试案例):

- (void)testReachability {
    XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for reachability"];

    [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        ...

        [expectation fulfill];

    }];

    [self waitForExpectationsWithTimeout:10 handler:^(NSError * _Nullable error) {
        // timed out waiting for reachability
    }];
}