2010-10-20 21 views
16

Trong hầu hết các lớp học của tôi làm việc với giá trị mặc định tôi làm cho giá trị mặc định đối tượng settable:Làm cách nào để kiểm tra với NSUserDefaults?

@property(retain) NSUserDefaults *defaults; 

Đây là nghĩa vụ phải thực hiện kiểm tra dễ dàng hơn:

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

Nhưng bây giờ tôi đã phát hiện ra sau đó khi tôi tạo một đối tượng mặc định mới, đã có một số giá trị trong đó. Điều đó có thể không? Tôi nghĩ rằng tôi có thể tạo ra một đối tượng mặc định rỗng, bị cô lập bằng cách gọi -init. Tôi có một lỗi nào đó trong mã thử nghiệm không, hoặc tôi có thực sự phải làm điều gì đó phức tạp hơn (như stubbing hoặc mocking) nếu tôi muốn kiểm tra mã dựa trên mặc định của mình không?

Trả lời

8

Cuối cùng, tôi đã tạo một thay thế đơn giản NSUserDefaults có thể được sử dụng để kiểm soát môi trường mặc định trong thử nghiệm. Mã này có sẵn trên GitHub.

+0

Cảm ơn bạn đã tạo điều này! – Palimondo

+0

rất đẹp, cảm ơn! Bây giờ tôi đang sử dụng lớp của bạn, nhưng thay vì tiêm 'NSUserDefaults' làm param cho' someObjectBeingTested', tôi đang sử dụng 'Kiwi' với khả năng nhạo báng của nó. Sử dụng một cái gì đó như: 'id transientDefaults = [NSUserDefaults transientDefaults]; [NSUserDefaults stub: @selector (standardUserDefaults) vàReturn: transientDefaults]; ' – kernix

6

Từ các tài liệu NSUserDefaults:

init: Trả về một đối tượng NSUserDefaults khởi tạo với giá trị mặc định cho tài khoản người dùng hiện tại.

Điều này thường không được để trống. Tôi không thực sự chắc chắn những gì bạn muốn thử nghiệm ở đây, vì nó sẽ là một sự lãng phí thời gian để kiểm tra chức năng NSUserDefaults.

Nhưng giả sử bạn cần một số khóa chưa được đăng ký để kiểm tra luôn có cùng điểm ban đầu: sau đó chỉ cần xóa chúng trong khi thiết lập (và khôi phục chúng sau này trong tearDown nếu bạn muốn).

Cái gì như:

- (void) setUp { 
    [super setUp]; 

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

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

Nếu bạn không có một danh sách cụ thể các phím nhưng cần phải tiêu diệt tất cả mọi thứ, bạn sẽ phải sử dụng Preferences CoreFoundation Utilities, xem CFPreferencesCopyKeyList.

+0

Tôi muốn kiểm tra mã sử dụng giá trị mặc định của người dùng cho một số đầu vào và đầu ra. Nếu tôi đã sử dụng mặc định người dùng "thực", tôi sẽ gặp khó khăn trong việc kiểm soát môi trường - tôi phải xóa các giá trị không mong muốn, khôi phục các giá trị không mong muốn sau khi chạy thử nghiệm và cứ tiếp tục như vậy. Cuối cùng tôi đã viết một loại thay thế mặc định cho mục đích thử nghiệm, xem câu trả lời của tôi. Cảm ơn bạn! – zoul

+0

Vì một số lý do, thiết lập khóa BOOL thành NO không hoạt động, nhưng việc sử dụng removeObjectForKey hoạt động hoàn hảo. Vì vậy, cảm ơn cho tip. – phatmann

Các vấn đề liên quan