1

我一直在尝试对异步请求进行自动化测试,但是在测试功能等待时,我无法在不同的线程中运行任何东西。这是测试功能:

- (void) testBoxManagerConnexionStatus
{
    ControlSender* cs = [ControlSender get];
    requestShouldSucceed = YES;
    [cs startCheckingReachabilityWithDelegate:self];
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:TIMEOUT_INTERVAL+1.0]];

    STAssertTrue(downloadComplete, @"Download should be over by now");
}

我的测试类以这种方式实现回调方法:

- (void)controlSender:(ControlSender *)controlSender sentSuccessfullyCode:(FreeboxControl)code
{
    if (requestShouldFail) {
        STAssertTrue(NO, @"Request should have failed");
    }
    downloadComplete = YES;

}
- (void)controlSender:(ControlSender *)controlSender couldntSendCode:(FreeboxControl)code details:(NSHTTPURLResponse*)details
{
    if (requestShouldSucceed) {
        STAssertTrue(NO, @"Request should have succeded");
    }
    downloadComplete = YES;
}

但是,每当我常用的代码尝试在不同的线程中运行某些东西时,什么都不会发生。例如 NSURLConnection 在分配时从不调用它的委托方法:

m_connexion = [[NSURLConnection alloc] initWithRequest:m_networkRequest delegate:self];

既不是-connectionDidFinishLoading:也不是-connection:didFailWithError:

像这样的电话也是如此:

[self performSelectorInBackground:@selector(BG_startCheckingReachabilityWithDelegate:) withObject:delegate];

运行测试时,Nothings 在后台被调用。不过,相同的代码在测试之外也能正常工作。有没有办法用 OCUnit 测试异步 url 请求?

谢谢您的帮助。

4

2 回答 2

2

您可以查看https://github.com/danielpunkass/RSTestingKit,它有一种在单元测试中等待运行循环的方法,您可以在http://www.red-sweater.com/talks/UnitTesting 看到他的幻灯片。 pdf了解一些背景知识。它可能有一些信息可以帮助您入门。

于 2010-11-29T20:08:14.720 回答
1

您可以尝试在后台线程中运行这样的请求,但您不想这样做。为了您的理智,您不希望您的测试依赖于外部服务。如果远程服务宕机了怎么办?你的测试失败了。如果远程服务返回错误怎么办?你的测试失败了?如果您想在远程服务以错误响应有效请求时执行您的代码怎么办?你不能(始终如一地)。即使您的测试通过了,它们也会运行缓慢,具体取决于远程服务响应所需的时间。

如果您出于测试的目的消除对任何远程服务的依赖,您的生活会更轻松。有关更详细的推理,请参阅此答案(和相关问题)。

于 2010-11-29T21:33:40.627 回答