2016-08-17 84 views
0

創建我有一個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未成功注入。

+0

你有任何工人屬性作爲任務?工人任務?這是MyTask對象。 – Sofeda

+0

'task'是'Worker'類的實例變量 –

+0

由於您有Worker類的初始化程序,所以您應該有MyTask類的初始化程序,並在此處初始化MyTask對象時從Worker類初始化程序中調用它。現在在安裝程序中設置你的workerToTest.task = mockedTask。或者在測試用例中寫入OCMClassMock([MyTask initialiser method]); – Sofeda

回答

0

你可以把它注射用OCMStub()像下面,你需要聲明task伊娃作爲屬性

@interface Worker : NSObject 
@property(nonatomic,strong)MyTask *task; 
@end 

//

id mockedTask = OCMClassMock([MyTask class]); 
OCMStub([workerToTest task]).andReturn(mockedTask); 

你的方法看起來就像

-(void)setup{ 
    // how to inject the mocked task in to this workerUnderTest 
    Worker *workerToTest = [[Worker alloc] initWithName:@"John"]; 

    id mockedTask = OCMClassMock([MyTask class]); 
    OCMStub([workerToTest task]).andReturn(mockedTask); 
} 
+0

作爲workerToTest部分模擬'工人'呢? –

+0

我得到編譯器錯誤「沒有已知的實例方法選擇器'任務'」 –

+0

相同的實現。如果你甚至將它存根完全模擬實現將是相同的 – iSashok