2010-10-20 113 views
16

在大多數我的班,與默認工作的我做了默認對象設定:如何使用NSUserDefaults進行測試?

@property(retain) NSUserDefaults *defaults; 

據說這是爲了使測試更加簡單:

// In a nearby test class: 
- (void) setUp { 
    [super setUp]; 
    NSUserDefaults *isolatedDefaults = [[NSUserDefaults alloc] init]; 
    [someObjectBeingTested setDefaults:isolatedDefaults]; 
} 

但現在我已經找到了,然後當我創建一個新的默認對象,其中已經有一些值。那可能嗎?我想我可以通過調用-init來創建一個空的,孤立的默認對象。如果我想測試基於默認的代碼,是否在測試代碼的某個地方有bug?還是我真的必須做更復雜的事情(如存根或模擬)?

回答

8

最後,我已經創建了一個簡單的替換NSUserDefaults可被用來控制在測試中的默認值的環境。該代碼可在GitHub上獲得。

+0

感謝您創造這個! – Palimondo 2012-11-15 14:44:24

+0

非常好,謝謝!我現在正在使用你的類,但是不用'NSUserDefaults'作爲'someObjectBeingTested'的參數注入,我使用'Kiwi'來模擬存根。使用類似:'id transientDefaults = [NSUserDefaults transientDefaults]; [NSUserDefaults存根:@selector(standardUserDefaults)和Return:transientDefaults];' – kernix 2015-01-21 20:53:58

6

從文檔NSUserDefaults的:

INIT:返回與默認值當前用戶帳戶初始化的對象NSUserDefaults的。

這通常不應該是空的。我不確定你想在這裏測試什麼,因爲測試NSUserDefaults功能會浪費時間。

但是說你需要某些鍵爲不爲測試尚未登記總是具有相同的初始點:然後就刪除它們的設置(如果你想在拆卸後恢復它們)。

喜歡的東西:

- (void) setUp { 
    [super setUp]; 

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"myTestKey"]; 

    // synchronize the change, or just use resetStandardUserDefaults: 
    [someObjectBeingTested setDefaults:[NSUserDefaults resetStandardUserDefaults]]; 
} 

如果沒有密鑰的具體名單,但需要消滅一切,你將不得不使用的CoreFoundation首實用程序,請參見CFPreferencesCopyKeyList。

+0

欲測試使用用戶的默認值對於某些輸入和輸出代碼。如果我使用「真正的」用戶默認值,我將難以控制環境 - 我必須刪除不需要的值,在運行測試後還原其他值,等等。最後,我寫了一種用於測試目的的默認替換,請參閱我的答案。謝謝! – zoul 2010-11-29 16:28:15

+0

出於某種原因,將BOOL鍵設置爲NO不起作用,但使用removeObjectForKey完美工作。所以謝謝你的提示。 – phatmann 2014-01-17 00:55:05