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

Posted

技术标签:

【中文标题】断言消息被发送到自己的 OCUnit【英文标题】:Assert that message is sent to self OCUnit 【发布时间】:2013-01-31 18:11:58 【问题描述】:

我对 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:。我正在考虑可能定义一个全局变量并调整该方法,以便它像他们建议的here 那样写,但我认为这可能太不优雅了。有没有办法使用 OCMock 来做到这一点?

【问题讨论】:

【参考方案1】:

使用 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:

【讨论】:

【参考方案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)之类的模拟框架。

【讨论】:

谢谢@Jon!我没想过子类化

以上是关于断言消息被发送到自己的 OCUnit的主要内容,如果未能解决你的问题,请参考以下文章

OCUnit、NSLog 和 XCode 3.1

如何向自己电脑的网卡发送消息?

分享知识-快乐自己:HTTP 响应码

Xcode 4 中的 SenTest OCUnit

微信怎么自己能给自己发信息

微信已发的消息删除后对方能看到吗?