首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OcMock -存根/期望/停止

OcMock -存根/期望/停止
EN

Stack Overflow用户
提问于 2013-05-24 14:13:48
回答 5查看 6.1K关注 0票数 3

在我的fixture setUp中,我有以下内容

代码语言:javascript
复制
-(void)setUp{
    _vc = [OCMockObject partialMockForObject:[[InboxViewController alloc] init]];
    //stub out the view stuff
    [[_vc stub] removeTask:OCMOCK_ANY];
    [[_vc stub] insertTask:OCMOCK_ANY];
}

fixture中有15个测试,但是,我需要实际测试这两个方法是否被调用,所以我编写了两个测试

代码语言:javascript
复制
-(void)someTest{
    [[_vc expect] removeTask:OCMOCK_ANY];
    [_vc removeAllTasksFromList:taskList notInList:newTaskList];
    [_vc verify];
}

但是这个测试失败了。

我也试过了

代码语言:javascript
复制
-(void)someTest{
    [[_vc stopMocking];
    [[_vc expect] removeTask:OCMOCK_ANY];
    [[_vc stub] removeTask:OCMOCK_ANY];
    [_vc removeAllTasksFromList:taskList notInList:newTaskList];
    [_vc verify];
} 

但是测试还是失败了。我是不是漏掉了什么,或者这只是OCMock的工作方式?

我能让它工作的唯一方法就是这样

代码语言:javascript
复制
-(void)someTest{
    //re create and init the mock object 
    _vc = [OCMockObject partialMockForObject:[[InboxViewController alloc] init]]; 
    [[_vc expect] removeTask:OCMOCK_ANY]; 
    [[_vc stub] removeTask:OCMOCK_ANY]; 
    [_vc removeAllTasksFromList:taskList notInList:newTaskList]; 
    [_vc verify]; 
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-26 01:21:26

也许文档应该更清晰一些。对于部分模拟,stopMocking所做的是将实际对象(在本例中是InboxViewController )恢复到其原始状态。调用stopMocking不会重置模拟对象,这意味着它不会清除存根和期望。您可以随时调用stopMocking,然后为相同的真实对象创建一个新的模拟。

正如在另一个答案中所指出的,通常最好避免存根和期望相同的方法,但如果必须这样做,请确保在存根之前设置expect;否则存根将处理调用,而expect永远看不到它们。

我知道传统上很多人推荐使用设置方法来设置测试对象。多年来,我的个人经验是,这通常是不值得的。在每个测试中节省几行代码可能看起来很吸引人,但最终它确实在各个测试之间创建了耦合,使套件更加脆弱。

票数 8
EN

Stack Overflow用户

发布于 2013-05-24 20:34:16

看起来你需要创建一个新的mock来期待一个你已经存根的方法。我建议您重新考虑在所有测试用例中使用部分模拟,如果您想这样做,请提取以下内容:

代码语言:javascript
复制
[[_vc stub] removeTask:OCMOCK_ANY];
[[_vc stub] insertTask:OCMOCK_ANY];

转换为助手方法,并从您真正需要的测试中调用该方法,将其从setUp方法中删除。

并且,小提示:),您应该在setUp实现开始时调用[super setUp]

票数 2
EN

Stack Overflow用户

发布于 2014-04-21 23:48:18

您可以执行以下操作来从OCMockObject中删除存根,这将使您能够将stub代码保留在-(void)setUp中,但仍然允许您在以后的测试中添加expect

将以下类别添加到您的测试中,以返回OCMockObject ivar。

代码语言:javascript
复制
@interface OCMockObject (Custom)
- (void)removeStubWithName:(NSString*)stubName;
@end

@implementation OCMockObject (Custom)
- (void)removeStubWithName:(NSString*)stubName {
    NSMutableArray* recordersToRemove = [NSMutableArray array];
    for (id rec in recorders) {
        NSRange range = [[rec description] rangeOfString:stubName];
        if (NSNotFound == range.location) continue;
        [recordersToRemove addObject:rec];
    }
    [recorders removeObjectsInArray:recordersToRemove];
}
@end

示例用法:确保在添加expect之前删除了方法的存根。

代码语言:javascript
复制
-(void)someTest{
    [_vc removeStubWithName:@"removeTask"];
    [[_vc expect] removeTask:OCMOCK_ANY];
    [_vc removeAllTasksFromList:taskList notInList:newTaskList];
    [_vc verify];
}

这将允许您的测试按照您预期的方式运行。

这是一个有用的技巧,至少在OCMock开发人员允许此功能之前是这样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16728686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档