为什么GHUnit异步测试中的错误断言会导致应用程序崩溃,而不是测试失败



这个问题的看法很少,还没有答案。如果你对这个问题有什么建议可以改变来吸引更多的眼球,我很乐意听听。干杯!

我使用GHAsyncTestCase来测试我的自定义NSOperation。我将测试用例设置为操作对象上的委托,并且在完成时在主线程上调用didFinishAsyncOperation

当断言失败时,它会抛出一个异常,该异常应该被测试用例捕获以将测试呈现为"失败"。但不是这种预期行为,只要断言失败,我的app get就会被Xcode终止。

***由于未捕获异常'GHTestFailureException'而终止应用程序,原因:" NO "应该是TRUE。这将触发一个失败的测试,但会导致应用程序崩溃。

我显然做错了什么。谁能告诉我?

@interface TestServiceAPI : GHAsyncTestCase
@end
@implementation TestServiceAPI
    - (BOOL)shouldRunOnMainThread
    {
        return YES;
    }
    - (void)testAsyncOperation
    {
        [self prepare];
        MyOperation *op = [[[MyOperation alloc] init] autorelease];
        op.delegate = self; // delegate method is called on the main thread.
        [self.operationQueue addOperation:op];
        [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.0];
    }
    - (void)didFinishAsyncOperation
    {
        GHAssertTrue(NO, @"This should trigger a failed test, but crashes my app instead.");
        [self notify:kGHUnitWaitStatusSuccess forSelector:@selector(testAsyncOperation)];
    }
@end

我花了一个星期的时间来寻找解决这个问题的方法,最后我终于找到了一个突破口。对赏金问题几乎没有意见,而且没有人愿意尝试回答,这有点奇怪。我在想这个问题可能很愚蠢,但是没有人反对,也没有人愿意纠正它。StackOverflow已经饱和了吗?

解决方案。

诀窍是不从回调方法中断言任何东西,而是将断言放回原始测试中。wait方法实际上阻塞了线程,这是我之前没有想到的。如果您的异步回调接收到任何值,只需将它们存储在变量或属性中,然后在原始测试方法中根据它们做出断言。

这将确保断言不会导致任何崩溃。

- (void)testAsyncOperation
{
    [self prepare];
    MyOperation *op = [[[MyOperation alloc] init] autorelease];
    op.delegate = self; // delegate method is called on the main thread.
    [self.operationQueue addOperation:op];
    // The `waitfForStatus:timeout` method will block this thread.
    [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.0];
    // And after the callback finishes, it continues here.
    GHAssertTrue(NO, @"This triggers a failed test without anything crashing.");
}
- (void)didFinishAsyncOperation
{
    [self notify:kGHUnitWaitStatusSuccess forSelector:@selector(testAsyncOperation)];
}

查找Xcode断点导航器,删除所有异常断点,这就是全部!!

查看GHUnit的头文件,看起来这可能是您的代码应该发生的事情。GHUnit的子类可以覆盖这个方法:

// Override any exceptions; By default exceptions are raised, causing a test failure
- (void)failWithException:(NSException *)exception { }

不抛出异常,但更简单的解决方案是使用GHAssertTrueNoThrow而不是GHAssertTrue宏。

我认为这个问题应该是,"如何测试方法与块在GHUnit"?

答案可以在这里找到:http://samwize.com/2012/11/25/create-async-test-with-ghunit/

相关内容

  • 没有找到相关文章

最新更新