断言该消息被发送到自己的OCUnit

时间:2013-01-31 18:11:59

标签: objective-c tdd ocunit ocmock

我对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是不是有办法做到这一点?

2 个答案:

答案 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)这样的模拟框架。