OCUnit 可以依赖后台线程中的代码吗? (为了测试异步请求)

Posted

技术标签:

【中文标题】OCUnit 可以依赖后台线程中的代码吗? (为了测试异步请求)【英文标题】:Can OCUnit rely on code in background threads? (in order to test asynchronous requests) 【发布时间】:2010-11-29 18:55:06 【问题描述】:

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

- (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];

运行测试时不会在后台调用任何内容。 不过,相同的代码在测试之外也能正常工作。 有什么方法可以用 OCUnit 测试异步 url 请求吗?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

【讨论】:

这真的很有趣。谢谢,我会试试看,如果可行,请告诉您。【参考方案2】:

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

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

【讨论】:

感谢 Adam,在寻找解决方案时,我已经阅读了您之前的帖子。我仍在尝试测试这些异步调用的原因是因为它们不是使用远程服务,而是使用本地网络 (wifi) 机顶盒。 (评论套件,似乎返回键验证评论)该应用程序是此机顶盒的遥控器,我想确保制造商不会更改 api(url,参数等)。另外,这将帮助我在 iphone 上睡醒时调试恼人的 wifi 丢失问题。 我不同意亚当。听起来您来自一个用例并且应用得太广泛了。依赖远程服务的测试用例是完全有效的,并且是正确测试端到端集成的唯一方法。您问“如果远程服务返回并出错怎么办”——这是一个有效的测试结果!我看到你对“存根依赖”的理解。当然,在代码的某些区域。取决于您正在测试的“单元”。

以上是关于OCUnit 可以依赖后台线程中的代码吗? (为了测试异步请求)的主要内容,如果未能解决你的问题,请参考以下文章

你还应该在单元测试中进行内存管理吗? (OCUnit)

OCUnit 中的简化断言

在后台线程上创建 UIViewController 可以吗?

浏览器页面关闭后台线程会中断吗

如何使用 Xcode 4 和 OCUnit 运行应用程序测试?

我们可以在 iOS 的后台线程上引导 Crashlytics 吗?