2015-12-24 84 views
0

我正在嘗試在我的類上測試另一個類上調用類方法的方法。如果重要的話,我打電話的第二類包含在框架內。模擬類方法不被調用

我試圖測試的方法的簡化版本。我只想驗證switch語句通過捕獲和驗證對[DataCapture trackEvent:]的調用來達到我期望的效果。

- (void)beaconValue:(NSInteger)value 
{ 
    NSString* elementIdValue; 
    switch(value) 
    { 
     case 1: 
      elementIdValue = @"One"; 
      break; 
     case 2: 
      elementIdValue = @"Two"; 
      break; 
     case 3: 
      elementIdValue = @"Three"; 
      break; 
    } 

    [DataCapture trackEvent:elementValueId]; 
} 

這裏是我寫的,我希望工作的測試:

- (void)testCaptureData_1 
{ 
    id mockDataCapture = OCMClassMock([DataCapture class]); 

    OCMExpect([mockDataCapture trackEvent:@"One"]); 

    [[BeaconingService sharedBeaconingService] beaconValue:1]; 

    OCMVerifyAll(mockDataCapture); 

    [mockDataCapture stopMocking]; 
} 

我總是驗證告訴我,沒有被引用的預期trackEvent方法,即使我改變我的希望[OCMArg任何]。我在做什麼明顯錯誤或是其他地方的問題(即糟糕的項目設置?)

回答

0

只要有人遇到類似問題,我可以通過將-bind_at_load -ObjC其他鏈接器標誌添加到我的測試目標來解決我的問題。

0

這看起來不錯,應該工作。我只能想到你觀察到的行爲的兩個原因。

如果DataCapture類有一個實例方法,也被稱爲trackEvent:那麼該模擬將模擬實例方法而不是類方法。在這種情況下,需要將方法調用包裝在ClassMethod()宏中,即OCMExpect(ClassMethod(...)))

如果不是這種情況,我的下一個猜測會是CocoaPods的一個問題。我見過幾個類似的報告,最終證明CocoaPods會以某種方式添加兩次相同的二進制文件。在這種情況下,OCMock有可能爲其中一個版本的課程添加魔法,但測試使用另一個版本。我沒有一個參考,但這不應該太難找到。

+0

謝謝,我將添加ClassMethod()包裝和雙重檢查。我沒有將我的測試目標添加到我的Podfile中,並將libPods.a鏈接到我的主目標和測試目標,是不是?當我構建這個測試目標時,我以爲我沒有鏈接就出錯了。 –

+0

還是沒有愛。我不僅執行了ClassMethod()封裝,而且還從測試目標中移除了libPod.a,仍然得到'未調用期望的方法'。 –

+0

我不是CocoaPods的專家。如果我記得以前的討論正確,但是,將libPods.a添加到兩個目標是導致許多問題的原因。請記住,這些是靜態庫,將它們添加到兩個目標將意味着相同的代碼(實際的二進制文件)將作爲每個目標中的獨立副本提供。 –