創建我有一個Worker
類,它的報頭:使用嘲笑對象在初始化
@interface Worker : NSObject {
// instance variable `task`
MyTask *task;
}
@end
其初始化劑方法是這樣的:
@implementation Worker
-(id)initWithName:(NSString*)name{
self = [super init];
if (self) {
// I need to use mocked task in my test case
task = [[MyTask alloc] init];
...
...
}
return self
}
-(void)doWork{
[task start];
}
欲單元測試這個類,我我使用OCMock庫來做模擬。我知道我可以通過創建一個嘲笑任務:
id mockedTask = OCMClassMock([MyTask class]);
但是,我怎麼能注入這個嘲笑任務到測試用例我Worker
例如?我的意思是任務是在創建初始化器方法,當我在我的測試類中創建一個工人實例:
-(void)setup{
// how to inject the mocked task in to this workerUnderTest
Worker *workerToTest = [[Worker alloc] initWithName:@"John"];
}
我需要的嘲笑任務測試中使用。我怎樣才能實現它?
====我的測試用例@ iSashok的答案(它不工作)====
@interface WorkerTestCase : XCTestCase
@end
@implementation WorkerTestCase{
Worker *workerToTest;
id mockedTask;
}
- (void)setUp {
[super setUp];
workerToTest = [[Worker alloc] initWithName:@"John"];
mockedTask = OCMClassMock([MyTask class]);
OCMStub([workerToTest task]).andReturn(mockedTask);
}
-(void) testDoWork{
[workerToTest doWork];
// it fails. method is not invoked!
OCMVerify([mockedTask start]);
}
...
@end
正如你看到的上面,我的測試用例失敗時,報告說有沒有在mockedTask
對象上調用。但是,當我將斷點設置爲實際的類實現時,將調用[task start]
,這表示mockedTask
未成功注入。
你有任何工人屬性作爲任務?工人任務?這是MyTask對象。 – Sofeda
'task'是'Worker'類的實例變量 –
由於您有Worker類的初始化程序,所以您應該有MyTask類的初始化程序,並在此處初始化MyTask對象時從Worker類初始化程序中調用它。現在在安裝程序中設置你的workerToTest.task = mockedTask。或者在測試用例中寫入OCMClassMock([MyTask initialiser method]); – Sofeda