2012-04-24 23 views
6

Có ai biết cách chụp đối số được gửi đến đối tượng OCMock không?Làm thế nào để tôi chụp một đối số được gửi đến một mô hình?

id mock = [OCMockObject mockForClass:someClass] 
NSObject* captureThisArgument; 
[[mock expect] foo:<captureThisArgument>] 

[mock foo:someThing] 
GHAssertEquals[captured, someThing, nil]; 

Tôi làm cách nào để xác thực đối số cho foo? Tôi rất vui khi làm điều đó trong một khối trong định nghĩa giả, nhưng nếu tôi có thể lấy vật thể ra để tôi có thể khẳng định về tính năng của nó sau này sẽ rất tuyệt vời.

Điều này có thể thực hiện với OCMock không?

Trả lời

9

Nếu bạn muốn xác thông số của bạn có thể bạn có thể làm điều đó trực tiếp trong khi bạn đang thiết cuống của bạn với một cái gì đó như:

id mock = [OCMockObject mockForClass:someClass]; 
NSObject* captureThisArgument; 
[[mock expect] foo:[OCMArg checkWithBlock:^(id value){ 
    // Capture argument here... 
}]]; 

Trân trọng, Quentin A

+0

Tôi thích điều này. Nó tương tự như cách tôi sẽ đi về chế nhạo với một trận đấu hancrest trong groovy. Cảm ơn :). –

3

Bạn có thể còn sơ khai cuộc gọi và vượt qua nó đến một khối xác minh nó:

NSObject *expected = ...; 

id mock = [OCMockObject mockForClass:someClass] 
void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation) { 
    NSObject *actual; 
    [invocation getArgument:&actual atIndex:2]; 
    expect(actual).toEqual(expected); 
}; 
[[[mock stub] andDo:theBlock] foo:[OCMArg any]]; 

[mock foo:expected]; 

Ngoài ra còn có một phiên bản gọi lại những điều này, nhưng dòng điều khiển trở nên phức tạp hơn, như bạn cần một biến trạng thái đó là có thể nhìn thấy để cả hai thử nghiệm của bạn và gọi lại xác minh:

[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument] 
+1

Cảm ơn. @ Quentin của câu trả lời là một trong những ngắn gọn tôi đã hy vọng, nhưng tôi thực sự đánh giá cao ví dụ của bạn quá. Thật tốt khi có một ví dụ về cách xác thực nhiều đối số tại thời gian nháp. (Tôi sẽ ném xác nhận trong theBlock nếu có gì không đúng). –

+0

Hai đối số đầu tiên của một NSInvocation được dành riêng cho bản thân và _cmd; đối số "đầu tiên" cho một phương thức ở chỉ số 2. – titaniumdecoy

+0

Bắt tốt @titaniumdecoy. Đã cập nhật câu trả lời của tôi. –

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