在使用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是没有问题的。 请问各位大大,有没有解决的办法?谢谢!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
单元测试是一个串行的执行过程,当执行完测试方法后,一个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等待的