2012-05-18 25 views
5

Tôi đang cố gắng viết một số Bài kiểm tra Đơn vị để kiểm tra một số tùy chỉnh NSOperations mà chúng tôi đang viết. Những gì tôi muốn làm là tạo ra một Mock của NSOperation và đặt nó trên NSOperationQueue, và sau đó chờ đợi cho nó để kết thúc. Tôi biết tôi có thể làm lu mờ các phương pháp và không sử dụng OCMoc k ở tất cả, nhưng tôi thực sự không muốn làm điều đó. Tôi muốn sử dụng OCMock. Mã Tôi đang cố gắng để chạy một cái gì đó như sau:OCMock NSOperation

MYOperation *operation = [MYOperation new]; 
id mockOperation = [OCMockObject partialMockForObject:operation]; 
[NSOperationQueue *queue = [NSOperationQueue new]; 
[queue setMaxConcurrentOperationCount:1]; 
[queue addOperation:mockOperation]; 

Khi kiểm tra đơn vị được đến dòng này:

[queue addOperation:mockOperation]; 

tôi nhận được một cuộc gọi đến một ngoại lệ đối tượng deallocated. Bất cứ ai có bất cứ đề nghị về cách tôi có thể vượt qua điều này?

+0

Đây có phải là dự án ARC không? –

+0

Có, đó là một dự án ARC. –

+0

Có một vấn đề trong thời gian chạy của Apple ảnh hưởng đến OCMock khi ARC được bật. Chi tiết hơn ở đây: http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=252 –

Trả lời

2

Nếu bạn đang sử dụng ARC, operation có thể được phát hành ngay sau khi bạn tạo mô hình, vì nó không được truy cập lại. Nếu bạn thay đổi điều này, điều này sẽ khắc phục lỗi:

[queue addOperation:operation]; 

... bạn nên làm bất kỳ cách nào - bạn đang thử nghiệm đối tượng của mình chứ không phải thử.

+0

Vấn đề với cách tiếp cận này là nếu tôi đưa ra một phương pháp trên mô hình, điều đó có được thực hiện hay không nó có thực thi phương thức trên hoạt động thực tế không? –

+0

Với mocks một phần, nếu bạn khai/mong đợi một phương thức, phương thức đó sẽ được gọi trên mô hình thay vì đối tượng thực tế. Một phần mocks cung cấp một cách để đánh chặn các tin nhắn cụ thể được gửi đến một đối tượng. Từ [tài liệu OCMock] (http://ocmock.org/#features): 'Khi một phương thức stubbed được gọi bằng cách sử dụng tham chiếu đến anObject, chứ không phải là mô hình, nó sẽ vẫn được xử lý bởi mock.' –

0

Khi sử dụng ARC, tham chiếu đến đối tượng trong mockOperation sẽ được đặt thành vô cùng tích cực (quá mức tôi nghĩ) bởi thời gian chạy của Apple. Tuy nhiên, không phải tất cả đều bị mất. Bạn có thể thiết lập các nhánh và kỳ vọng của mình bằng cách sử dụng mockOperation và vẫn vượt qua hoạt động với phương thức addOperation:; mô phỏng một phần hoạt động ngay cả khi bạn sử dụng một tham chiếu đến đối tượng gốc.

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