我对OCUnit相当新,我试图将一个测试用例添加到一个看起来像这样的方法:
- (void) processMessageBody:(XMPPMessage *)message
fromNick:(NSString *)nick;
{
BOOL isEcho;
SBEventMessage *eventMessage = [self parseMessageBody:message
fromNick:nick
isEcho:&isEcho];
if (isEcho)
{
NSString *requestID = [[message attributeForName:kSBMessageIDField] stringValue];
[self processResponse:eventMessage
error:nil
forRequest:requestID];
}
}
我已成功为parseMessageBody:fromNick:isEcho:
方法编写了testCases,所以我确信该方法可以正常工作。但是我想测试在正确的场景中调用processResponse:error:forRequest:
。我正在考虑定义一个全局变量并调整该方法,以便它像他们建议的那样写here,但我想这可能太不优雅了。使用OCMock是不是有办法做到这一点?
答案 0 :(得分:4)
使用OCMock,您可以使用部分模拟执行此操作:
-(void)testProcessMessageBodyCallsProcessResponse {
// let's pretend this initializer exists
XMPPMessage *bar = [XMPPMessage messageWithRequestId:@"baz"];
Foo *processor = [[Foo alloc] init];
id mockProcessor = [OCMockObject partialMockForObject:processor];
[[mockProcessor expect] processResponse:OCMOCK_ANY error:nil forRequest:@"baz"];
[processor processMessageBody:bar fromNick:@"nick"];
[mockProcessor verify];
}
您还可以模拟对parseMessageBody:fromNick:isEcho:
的调用,在这种情况下,您可以验证是否已将responseBody
传递给processMessageBody:fromNick:
。
答案 1 :(得分:2)
子类和覆盖方法。在测试文件中直接定义以下内容。假设你的班级名字是Foo。
@interface TestFoo : Foo
@property (assign, nonatomic) NSUInteger processResponseCount;
@property (strong, nonatomic) SBEventMessage *processResponseEventMessage;
@property (strong, nonatomic) id processResponseError;
@property (copy, nonatomic) NSString *processResponseRequestID;
@end
@implementation TestFoo
- (void)processResponse:(id)eventMessage error:(id)error forRequest:(id)requestID
{
++_processResponseCount;
_processResponseEventMessage = eventMessage;
_processResponseError = error;
_processResponseRequestID = requestID;
}
@end
现在在测试中,创建一个TestFoo而不是Foo。然后,您可以编写
的测试...那就是说,考虑一下你是否应该提取另一个类,并将此方法移动到它。然后你可以使用像OCMock(或OCMockito)这样的模拟框架。