单元测试 - iOS,使用OCUnit测试时,线程不启动
怪我咯
怪我咯 2017-04-17 11:54:13
[iOS讨论组]

在使用ocunit进行单元测试时,发现这个问题 我要测试的方法是:testThread 如下:

@implementation testNSThread

- (BOOL)testThread
{
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(thread) object:nil];
    [thread start];

    return YES;
}

- (void)thread
{
    NSLog(@"thread**********************");
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(thread2) object:nil];
    [thread start];
}

- (void)thread2
{
    NSLog(@"thread2**********************");
}

@end

测试方法这么写的:

@implementation testTestNSThreadTests

- (void)setUp
{
    [super setUp];

    // Set-up code here.
}

- (void)tearDown
{
    // Tear-down code here.

    [super tearDown];
}

- (void)testExample
{
    testNSThread *_testNSThread = [[testNSThread alloc] init];
    STAssertTrue([_testNSThread testThread], @"test");
}

@end

最后的结果是:第二个线程没有在测试中启动,也就是说 thread2********************** 没有打印,但是正常调用testThread是没有问题的。 请问各位大大,有没有解决的办法?谢谢!

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(1)
大家讲道理

单元测试是一个串行的执行过程,当执行完测试方法后,一个RunLoop就会结束,另一个线程也就来不及执行。 需要你在测试方法里,也就是主线程里,等待testThread里的线程执行完,然后再继续

对于你的这个例子,testThread非常简单,只是打印一行Log,所以只要在 线程start之后再做一点别的事,比如

NSLog("Wait a second.");
就可以等到另一个线程的打印结果了。

如果是一个大工程,在另外的线程里做了很多事,就需要特意去等待。

- (BOOL)testThread
{
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(thread) object:nil];
    [thread start];
    [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
以上代码是让run loop等待1秒。 另还可以通过条件,循环运行
while(condition)
{
    [runLoop runUntilDate:[NSDate date]];
}
这样做可以控制RunLoop的等待时长

另:看一下 https://github.com/danielpunkass/RSTestingKit 这个框架,是支持RunLoop等待的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号