0

我对 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:,因此我确信该方法可以正常工作。但是我想测试processResponse:error:forRequest:在正确的场景中调用它。我正在考虑可能定义一个全局变量并调整该方法,以便它像他们在这里建议的那样写,但我认为这可能太不优雅了。没有办法使用 OCMock 做到这一点吗?

4

2 回答 2

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

于 2013-02-02T00:44:22.850 回答
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)这样的模拟框架。

于 2013-02-01T02:22:19.560 回答