2014-02-26 54 views
0

如果沒有明顯引入延遲,則模仿NSNotificationCenter有時可能會失敗。我創建其中I加入一個單一的測試,測試的通知使用OCMock嘲弄NSNotificationCenter有時會失敗,除非添加延遲

id mock = [OCMockObject observerMock]; 
[[NSNotificationCenter defaultCenter] addMockObserver:mock name:kMyNotification object:nil]; 

[[mock expect] notificationWithName:kMyNotification object:[OCMArg any] userInfo:[OCMArg any]]; 

MyCoolClass *cool = [MyCoolClass new]; 

[cool methodthatPostsANotification]; 

//[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; 

[mock verify]; 

[[NSNotificationCenter defaultCenter] removeObserver:mock]; 

基本上該測試失敗週期性除非該註釋runloop線未被註釋一個簡單的測試項目。但是,如果這條線未註釋,它總是成功,因爲我期望它。根據蘋果文檔通知應該同步傳遞,但與行爲,我看到它的行爲像它的異步。基本上我不想在我的單元測試中添加任何有意的延遲/睡眠,以確保它們通過。有沒有什麼可以做的,使這些測試總是通過沒有添加延遲代碼?

回答

1

OCMock在異步過程中無法正常工作。通常不建議在單元測試中使用NSNotificationCenter。相反,您應該創建一個基本的模擬,並精確控制何時向通知觀察員發送通知。

這不是那麼容易,但如果你真的想隔離你需要測試的代碼和確定性結果,這是強制性的。

+0

因此,如果我正確地閱讀你的答案,你是否建議像這樣的https://gist.github.com/anonymous/9237241? –

+0

是的,只是使用你的模擬而不是真正的通知中心,並同步控制一切。這是主意。 –