2011-12-15 22 views
8

Tôi đang xây dựng một số thử nghiệm Kiwi và nhận được cảnh báo mà tôi không thể giải thích. Tôi mới đến Kiwi.Thử nghiệm đơn vị Kiwi Spec: Phương pháp thể hiện '-attachToVerifier: xác minh:' không tìm thấy

Tôi có một thiết lập mô hình đối tượng:

id conversationMock = [KWMock mockForProtocol:@protocol(Conversation)]; 
[conversationMock stub:@selector(end)]; 

Và trong bộ điều khiển của tôi, một tài sản gọi là "nói chuyện":

@interface MyController() 
@property (nonatomic, assign) id<Conversation> conversation; 
@end 

Các mô hình được gán cho tài sản, sau đó trong spec tôi kiểm tra xem liệu phương thức "kết thúc" có được gọi trong cuộc trò chuyện hay không:

it(@"should end conversation", ^{ 
    [[[myController.conversation] should] receive] end]; 
    [myController stopTalking]; 
}); 

Trình biên dịch (LLVM 3. 0) đang hiển thị cảnh báo: "Phương thức thể hiện" -attachToVerifier: trình xác minh: 'không tìm thấy "

Nguyên nhân của việc này là gì? Đây có phải là thứ tôi cần sửa không? (Thử nghiệm chạy ok, kiểm tra các cuộc gọi phương pháp để chấm dứt làm việc ok)

Trả lời

12

typecasting id để một NSObject được thoát khỏi những cảnh báo:

[[(NSObject *) [myController.conversation] nên] nhận] cuối ];

+0

Có cùng một vấn đề và điều này đã khắc phục được sự cố. Tuy nhiên không có cách nào khác để giải quyết nó? Nó phá hủy lợi thế dễ đọc Kiwi có trên các khuôn khổ thử nghiệm khác. – Sunkas

+0

Tôi vẫn thích Kiwi và tôi đã sử dụng nó rất nhiều trong 6 tháng qua và chỉ thỉnh thoảng mới gặp sự cố này. Đừng để điều này làm bạn thất vọng. –

+1

Tôi thấy điều này xảy ra khi cố gắng xác minh trên các đối tượng thuộc loại 'id ', ngoại trừ nó thực sự gây ra lỗi và không biên dịch. Đúc thành 'NSObject *' đã thực hiện thủ thuật nhưng rất xấu. –

9

Những gì bạn cần làm là:

build settings -> Other Linker flags 

Thêm cờ: -all_load

+0

Tôi muốn đưa ra phản hồi này nhưng bạn có thể giải thích tại sao điều này là cần thiết không? – avelis

+1

-attachToVerifier: Trình xác minh: được định nghĩa trong một danh mục trên NSObject trong tệp NSObject + KiwiVerifierAdditions - (id) attachToVerifier: (id ) aVerifier;
-attachToVerifier: trình xác minh: hiển thị lúc biên dịch để ứng dụng biên dịch ok. Cảnh báo của LLVM là do id đúc <-> NSObject Theo như tôi biết, Trình liên kết mục tiêu-C không tải các đối tượng chỉ chứa các danh mục. -all_load buộc trình liên kết tải tất cả các tệp đối tượng hiện có để cuối cùng nó sẽ tải tệp đối tượng có attachToVerifier… Hy vọng điều này sẽ hữu ích. – Komposr

+0

Lần thử đầu tiên '-ObjC', chỉ bắt buộc tải từ các tệp đối tượng bằng mã Objective-C. Cờ này không sử dụng để làm việc, và '-all_load' là giải pháp thay thế (xem Apple TN QA1490), nhưng có vẻ như nó hoạt động tốt. (Tôi đã có lỗi của OP và câu trả lời này xâu chuỗi bộ nhớ của tôi; Tôi đã thử '-ObjC' và nó đã khắc phục được sự cố.) –

1

Dựa trên câu trả lời @ Komposr, tôi nhìn vào một vài dự án của tôi với Kiwi và thấy rằng tôi cần phải làm như sau:

Build Settings -> Flags Linker khác

thêm lá cờ: -ObjC

Note rằng tôi KHÔNG SỬ DỤNG CocoaPods. Tôi đã tải xuống và biên dịch Kiwi dưới dạng thư viện tĩnh mà tôi đang bao gồm ...

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