2013-08-17 38 views

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.

+0

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

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. –

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