断言消息被发送到自己的 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的主要内容,如果未能解决你的问题,请参考以下文章