を行うまで、私はNSThread
を継承MyService
クラスを有するセレクタを実行する機能をテストし、待つ:ユニットがが
ヘッダ:
@interface MyService : NSThread {
-(void) startMe;
-(void) doTask;
...
}
実装:
@implementation MyService
-(void)startMe {
[self start];
}
-(void) doTask {
[self performSelector:@selector(checkData:) onThread:self withObject:nil waitUntilDone:YES];
}
-(void) checkData {
...
// NOTE: dataChecked is an instance variable.
dataChecked = YES;
}
@end
私がしたいです上記の-(void)doTask
をユニットテストし、-(void)checkData
が実際に呼び出されたことを確認してください。
-(void) testCheckData {
// partial mock MyService
id myService = [OCMockObject partialMockForObject:[MyService getInstance]];
[myService startMe];
// function to test
[myService doTask];
// I wait 2 seconds for checkData to finish its work
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));
dispatch_after(delayTime, dispatch_get_main_queue(), ^(void){
// When running this test case, these code is never called & test passed successfully, WHY?
NSLog(@"Check if checkData does its work");
XCTAssertTrue([self isDataChecked]);
});
}
つの質問:
Q1私はMyService
&は、以下の方法を試してみました、部分的にモックにOCMock libraryを使用しています。あなたは上記を参照したように、私のテストケースでは、私が2秒は、その結果を主張し、実行され-(void)checkData
を期待して待ち-(void)doTask
& を呼び出しますが、テストケースを実行しているとき、それは渡さdispatch_after(...)
&テスト中にブロックを実行しません。ブロックを実行しないのはなぜですか?
Q2。 NSObject#performSelector:onThread:withObject:waitUntilDone:を呼び出す-(void)doTask
のような関数を単体テストする正しい方法は何ですか?
'XCTestExpectation'と' waitForExpectationsWithTimeout: 'を使う必要があります。ここではかなり良い説明です。https://www.bignerdranch.com/blog/asynchronous-testing-with-xcode-6/ – sbarow
はタイムアウトパラメータです秒またはミリ秒で? –
正しくリコールすれば数秒です。 – sbarow