Sự cố này khiến tôi phát điên, nhưng tôi có thể nhận được NSLocalizedString
để hoạt động.
zoul đã đúng, nếu bạn in mainBundle vào bảng điều khiển trong kiểm tra logic, nó không phải là cùng một gói chứa tệp Localizable.strings của bạn. Bạn cần định nghĩa lại điều kiện NSLocalizedString
bất cứ khi nào bạn chạy thử nghiệm đơn vị của mình. Tôi đã làm điều đó trong các bước sau:
- Chúng ta cần một cách để biết khi nào chúng tôi trong mục tiêu kiểm tra logic của chúng tôi, vì vậy thêm một cái gì đó giống như LOGIC_TESTS để
Preprocessor Macros
xây dựng thiết lập kiểm tra logic mục tiêu của bạn.
Chỉ có 1 vị trí trong mã của tôi nơi tôi cần xác định lại NSLocalizedString
, vì vậy tôi có thể đặt mã sau vào tiêu đề tương ứng với lớp đó. Nếu bạn gặp vấn đề này ở nhiều nơi, tôi khuyên bạn nên đặt mã sau vào tiêu đề và #include
-nhấn vào nơi bạn cần (tôi đã thử sử dụng tệp .pch nhưng không hoạt động trong Kiểm tra logic). Dù sao, đặt một nơi nào đó trong tiêu đề của lớp (es) mà sử dụng NSLocalizedString
:
#ifdef LOGIC_TESTS
#undef NSLocalizedString
#define NSLocalizedString(key, comment) [[NSBundle bundleWithIdentifier:@"YOUR_IDENTIFIER"] localizedStringForKey:(key) value:@"" table:nil]
#endif
Thay YOUR_IDENTIFIER
với Bundle Định danh của gói ứng dụng của bạn (tìm thấy trong tập tin Info.plist
của bạn, quan trọng là CFBundleIdentifier
). Điều này giả định rằng bạn đã xác định LOGIC_TESTS
làm macro tiền xử lý chỉ trong mục tiêu Kiểm tra logic của bạn.
chỉnh sửa: Thật kỳ lạ, khi tôi xóa một số mã gỡ lỗi giải pháp này đã ngừng hoạt động. Dường như bạn cũng phải lừa Xcode để tải gói. Sau đây làm nó:
NSString *path = @"path_to_main_bundle";
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSLog(@"bundles: %@", [NSBundle allBundles]);
đâu path_to_main_bundle
là == [[NSBundle mainBundle] bundlePath]
khi bạn chạy mục tiêu chính của bạn. Chỉ cần đăng nhập nó một lần trong gdb hoặc sử dụng NSLog
trên đại biểu ứng dụng của bạn để lấy đường dẫn. Nó sẽ trông giống như /Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app
.
Tôi đã đặt mã đó trong cuộc gọi thiết lập cho một trong các lớp kiểm tra logic của tôi. Và không, tôi không có ý tưởng tại sao tôi phải đăng nhập allBundles để làm cho nó hoạt động, vì vậy bất cứ ai có một đầu mối, xin vui lòng cho tôi biết!
Phải có một cách duyên dáng hơn để thực hiện việc này, nhưng tôi có những thứ khác mà tôi cần phải thực hiện. Tôi nghi ngờ việc sửa chữa thực sự là tìm cách để xác định vị trí các tài nguyên bó mà không gặp khó khăn và khó hiểu. – kevboh
Dude! Cảm ơn một câu trả lời chi tiết như vậy. Đây sẽ là một trợ giúp lớn. Tôi ngạc nhiên vì vậy rất ít người dường như đã gặp phải điều này - có thể không có nhiều người địa phương hóa thử nghiệm đơn vị. ;-) –
Không sao cả. Vâng, thật kỳ lạ khi tôi không thể tìm thấy bất cứ điều gì về vấn đề này trong interwebs. Chắc chắn cho tôi biết nếu bạn tìm ra bất cứ điều gì khác về điều này. – kevboh