Tôi đang học thử nghiệm OCMock cho iOS. Sự khác biệt giữa "mô hình lớp" và "mô phỏng một phần" là gì và khi nào bạn nên sử dụng mô hình này với người khác?iOS OCMock mô phỏng một phần so với lớp học
6
A
Trả lời
12
Class mocks
tạo các đối tượng có mocks tinh khiết của một cá thể của lớp.
Partial mocks
lấy một ví dụ của một lớp cho phép bạn khai báo bất kỳ phương pháp nào của nó.
Giả sử tôi có các lớp:
@interface Foo : NSObject
- (void)doX;
@end
@implementation
- (void)doX
{
NSLog(@"X");
}
@end
@interface Bar : NSObject
- (void)doA:(Foo *)foo;
- (void)doB;
@end
@implementation Bar
- (void)doA:(Foo *)foo
{
NSLog(@"A");
[foo doX];
[self doB];
}
- (void)doB
{
NSLog(@"B");
}
@end
Tôi quan tâm đến phương pháp thử nghiệm Bar doA:
. Tôi hy vọng nó sẽ gọi doX
trên một đối tượng Foo
, sau đó gọi phương thức doB
của riêng nó. Tôi sẽ thực hiện điều này bằng cách sử dụng một lớp giả của một Foo và một phần giả của một Bar.
- (void)test_doA_shouldCall_doX_and_doB
{
id objectUnderTest = [OCMockObject partialMockForObject:[Bar new]];
id fooMock = [OCMockObject mockForClass:Foo.class];
[[fooMock expect] doX];
[[objectUnderTest expect] doB];
// Make the call
[objectUnderTest doA:fooMock];
[objectUnderTest verify];
[fooMock verify];
}
Bạn thấy ở đây giả lập một phần cho phép tôi gọi phương thức thực mà tôi muốn kiểm tra trong khi chế nhạo một cuộc gọi nội bộ đến một phương thức khác của nó. Bởi vì tôi không cần bất kỳ chức năng thực sự nào của Foo, tuy nhiên, tôi đã sử dụng một mô hình lớp học.
Các vấn đề liên quan
- 1. Phần cứng Mô phỏng
- 2. Lớp học - ví dụ so với phương pháp lớp học
- 3. Âm thanh mô phỏng iOS
- 4. Mô phỏng GPS trong iOS
- 5. lớp học một phần java
- 6. Trình mô phỏng iOS 7 so với các khác biệt về thiết bị?
- 7. iOS 6 mô phỏng trong Xcode 5
- 8. iOS: Phương pháp thử nghiệm chậm hơn 25 lần trên thiết bị so với mô phỏng
- 9. C so với C++ để mô phỏng số (hiệu suất)
- 10. xcodebuild, thiếu sdk mô phỏng iOS
- 11. Nhật ký sự cố mô phỏng iOS
- 12. C# Các lớp học một phần
- 13. Làm thế nào để mô phỏng ** tham số trong OCMock trong ARC
- 14. Xử lý hình ảnh, mở rộng các lớp học JPanel và mô phỏng trong Clojure
- 15. Mô phỏng phần cứng tăng tốc GPU?
- 16. Mô phỏng động lực học phân tử trong Python
- 17. Mô phỏng phím Tab Nhấn trong iOS SDK
- 18. Trình mô phỏng iOS và XCode để mô phỏng La bàn?
- 19. Mô-đun và Lớp học trong OCaml
- 20. Công cụ để kết hợp các lớp học một phần thành một lớp học?
- 21. Tìm các lớp học có sẵn trong Học phần
- 22. mô phỏng nâng cấp ứng dụng trong iOS
- 23. Thêm mô tả lớp học vào mã?
- 24. Cách gọi các phương thức lớp trong trình mô phỏng iOS bằng lldb?
- 25. Mô tả Python với các lớp học kiểu cũ
- 26. nodejs: Mô-đun nút so với các lớp singleton
- 27. Trình mô phỏng ios hiển thị màn hình màu đen
- 28. Chuyển đổi một lớp học thành một phần mở rộng
- 29. Mô phỏng mở/đóng bàn phím phần cứng trong trình mô phỏng
- 30. Lấy tên lớp học từ một mô-đun
Cảm ơn câu trả lời thực sự hữu ích. Tôi có hai câu hỏi followup: 1) Có đúng là mocks tinh khiết không cho phép bạn gọi bất kỳ phương pháp thực sự? 2) Tại sao bạn không thể tạo ra một phần giả của Foo và sau đó làm một mong đợi về phương pháp doX? – user1802143
1. Một mô hình thuần túy không được hỗ trợ bởi một đối tượng thực, nhưng về mặt kỹ thuật, bạn có thể thiết lập bất kỳ phương thức nào để gọi bất kỳ phương thức nào bằng cách sử dụng 'andCall' hoặc' andDo' - một phần giả cho phép bạn thực hiện 'andForwardToRealObject'. 2. Bạn có thể tạo ra một phần giả của Foo - đôi khi việc tạo ra một đối tượng có tác dụng phụ hoặc liên quan đến công việc không liên quan đến thử nghiệm của bạn. Ngoài ra, một mô hình thuần túy mà không phải là một mô hình tốt đẹp sẽ phàn nàn khi một phương pháp bất ngờ được gọi là trong khi một mô hình một phần sẽ không. –