正在调用委托方法的XCTest测试

 爱在逃离 发布于 2023-01-12 12:42

我一直在尝试测试我创建的一些类,这些NSNetServer类使用类来执行网络操作.我有一些问题确保调用委托方法.

我尝试了很多方法,包括:

在其他动作发生时使用[NSThread sleepForTimeInterval:5.0f];[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.0f]];简单地暂停.该NSRunLoop方法在第一次调用时工作(如下面的示例代码所示),但在第二次调用时崩溃.我理解也不是"正确"的做事方式,但我不知道"正确"的方式是什么.

使用NSConditionNSConditionLock类似乎只是锁定代码和回调从不被调用.

while在回调方法中更改的变量上使用循环,与上面相同.

下面是带有一些额外注释的代码,为简单起见,删除了一些测试:

- (void)testCheckCredentials
{
    [self.server start];
    // Create a client
    self.nsb = [[NSNetServiceBrowser alloc] init];
    // Set the delegate to self
    self.nsb.delegate = self;
    // Search for the server
    [self.nsb searchForServicesOfType:self.protocol inDomain:@""];
    // Wait for the service to be found and resolved
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:self.timeout]];
    XCTAssertTrue(self.serviceWasFound, @"Service was not found");
    // Open the connection to the server
    XCTAssertTrue([self.serverConnection open], @"Connection to server failed to open");
    // Wait for the client to connect
    /* This is where it crashes */
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:self.timeout]];
    XCTAssertTrue(self.clientDidConnect, @"Client did not connect");
    /* Further, more class-specific tests */
}

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing
{
    NSLog(@"Found a service: %@ (%@)", service.name, service.domain);
    if ([self.serverName isEqualToString:service.name]) {
        self.serviceWasFound = YES;
    }
}

- (void)clientDidConnect:(RCFClientConnection *)client
{
    XCTAssertNotNil(client, @"Connected client is nil");
    self.clientConnection = client;
    self.clientDidConnect = YES;
}

我也试过lock在一个NSCondition对象上做一个:

[self.nsb searchForServicesOfType:self.protocol inDomain:@""];
// Wait for the service to be found and resolved
[self.lock lockWhenCondition:1];
XCTAssertTrue(self.serviceWasFound, @"Service was not found");

self.serviceWasFound = YES;
[self.lock unlockWithCondition:1]

使用lock方法时,netServiceBrowser:didFindService:moreComing:永远不会调用该方法,当我使用时:

while (!self.serviceWasFound) {};

我还在学习Objective-C,但我只是完全坚持这个问题.

1 个回答
  • 为了处理调用异步执行方法和函数的测试组件,XCTest在Xcode 6中得到了增强,包括使用新API和类XCTestExpectation对象处理块的能力.这些对象响应新的XCTest方法,这些方法允许测试方法等待,直到异步调用返回或达到超时.

    以下是上述摘录的Apple文档链接. 编写异步操作测试

    @interface sampleAPITests : XCTestCase<APIRequestClassDelegate>{
    APIRequestClass *apiRequester;
    XCTestExpectation *serverRespondExpectation;
    }
    @end
    
    //implementation test class
    - (void)testAPIConnectivity {
    // This is an example of a functional test case.
    serverRespondExpectation = [self expectationWithDescription:@"server responded"];
    [apiRequester sendAPIRequestForMethod:nil withParams:nil];//send request to server to get tap info
    apiRequester.delegate = self;
    [self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
        if (error) {
            NSLog(@"Server Timeout Error: %@", error);
        }
       nslog(@"execute here after delegate called  or timeout");
    }];
    XCTAssert(YES, @"Pass");
    }
    
    //Delegate implementation
    - (void) request:(APIRequest *)request didReceiveResponse:(NSDictionary *)jsonResponse success:(BOOL)success{
    [serverRespondExpectation fulfill];
    XCTAssertNotNil(jsonResponse,@"json object returned from server is nil");
    }
    

    2023-01-12 12:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有