Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 单元测试中使用AFN网络监控可达性失败_Objective C_Unit Testing_Afnetworking 2_Reachability_Ocmock - Fatal编程技术网

Objective c 单元测试中使用AFN网络监控可达性失败

Objective c 单元测试中使用AFN网络监控可达性失败,objective-c,unit-testing,afnetworking-2,reachability,ocmock,Objective C,Unit Testing,Afnetworking 2,Reachability,Ocmock,在我正在工作的一个项目中,我已经实现了这个示例 当我运行实际应用程序时,它会进入块内,然后从块内进入开关: [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { 另外,当我调用…reachabilityManager]isReachable时,方法按预期返回true 当我尝试进行单元测试时,问题就出现了。我编写

在我正在工作的一个项目中,我已经实现了这个示例

当我运行实际应用程序时,它会进入块内,然后从块内进入开关:

[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
另外,当我调用
…reachabilityManager]isReachable时,
方法按预期返回true

当我尝试进行单元测试时,问题就出现了。我编写的一个类方法使用
…reachabilityManager]isReachable
作为前提条件,它返回false,奇怪的是,在调试过程中,我注意到它没有进入上面的块,它跳过了它

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

我甚至尝试模拟在单元测试中使用的实现HTTP Manager可访问性示例的类,但它给出了相同的结果:

// 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:

看起来信号量/XTestExpection没有帮助,问题出在AFNetworkReachabilityManager::startMonitoring中:

  • 获取所需回调的唯一方法是在
    dispatch\u async(dispatch\u get\u main\u queue())的startMonitoring方法中^{
    回调(状态);
但是它在单元测试之外运行,即使我们使用前面提到的信号量/XctestExpection

仍在寻找灵魂

EDIT2:


我试图按照测试异步代码的方法进行测试,但它似乎缺少一些代码,并且一些解释缺少集成细节。

我认为休眠线程会导致问题

尝试使用中记录的期望API

类似于此的内容应该可以让您开始(注意,这更多的是对expectations API的演示,而不是一个完整的工作测试用例):


感谢您的回复。我尝试了,但失败了。此外,我尝试使用与XTestExpection相同的信号量,但也失败了。它从未进入块-请记住,在调试期间,我观察了basicNetwork对象,并使用正确的URL对其进行了完全初始化。我想我在运行实际应用程序t时发现了问题到达setReachabilityStatusChangeBlock的第一个调用不会进入该块,只有在第二个调用(这是AFNetworking的回调)时才会进入该块。因此现在的问题是如何启用该回调(在单元测试中)虽然单元测试实际上是同步的…我不确定您要测试什么,但也许您可以捕获状态更改块,并使用不同测试用例的不同参数执行它。这对您有意义吗?事实上没有。正如我所写的,我正试着测试一个方法,该方法正在做一些事情,但前提是我thod是isReachable方法,这就是问题所在。如果您模拟
管理器.reachabilityManager
并将
isReachable
方法存根为始终返回YES,该怎么办?这将允许您进行测试。请注意,通过实际使用可访问性对象,您在测试中引入了依赖项。问题在于OCMock无法返回原语。OCMockito可以,但不允许部分模拟。我仍在寻找一个可以结合这两个功能的解决方案。
- (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
    }];
}