在我正在开展的项目中,我实施了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);
但即使我们使用所提到的信号量/ XCTestExpectation,它也会在单元测试之外运行。
仍在寻找灵魂......
EDIT2:
我试图关注objc.io 测试异步代码,但似乎缺少一些代码,而且有些解释缺乏集成细节。
答案 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
}];
}