在我的fixture setUp中,我有以下内容
-(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个测试,但是,我需要实际测试这两个方法是否被调用,所以我编写了两个测试
-(void)someTest{
[[_vc expect] removeTask:OCMOCK_ANY];
[_vc removeAllTasksFromList:taskList notInList:newTaskList];
[_vc verify];
}但是这个测试失败了。
我也试过了
-(void)someTest{
[[_vc stopMocking];
[[_vc expect] removeTask:OCMOCK_ANY];
[[_vc stub] removeTask:OCMOCK_ANY];
[_vc removeAllTasksFromList:taskList notInList:newTaskList];
[_vc verify];
} 但是测试还是失败了。我是不是漏掉了什么,或者这只是OCMock的工作方式?
我能让它工作的唯一方法就是这样
-(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];
}发布于 2013-05-26 01:21:26
也许文档应该更清晰一些。对于部分模拟,stopMocking所做的是将实际对象(在本例中是InboxViewController )恢复到其原始状态。调用stopMocking不会重置模拟对象,这意味着它不会清除存根和期望。您可以随时调用stopMocking,然后为相同的真实对象创建一个新的模拟。
正如在另一个答案中所指出的,通常最好避免存根和期望相同的方法,但如果必须这样做,请确保在存根之前设置expect;否则存根将处理调用,而expect永远看不到它们。
我知道传统上很多人推荐使用设置方法来设置测试对象。多年来,我的个人经验是,这通常是不值得的。在每个测试中节省几行代码可能看起来很吸引人,但最终它确实在各个测试之间创建了耦合,使套件更加脆弱。
发布于 2013-05-24 20:34:16
看起来你需要创建一个新的mock来期待一个你已经存根的方法。我建议您重新考虑在所有测试用例中使用部分模拟,如果您想这样做,请提取以下内容:
[[_vc stub] removeTask:OCMOCK_ANY];
[[_vc stub] insertTask:OCMOCK_ANY];转换为助手方法,并从您真正需要的测试中调用该方法,将其从setUp方法中删除。
并且,小提示:),您应该在setUp实现开始时调用[super setUp]。
发布于 2014-04-21 23:48:18
您可以执行以下操作来从OCMockObject中删除存根,这将使您能够将stub代码保留在-(void)setUp中,但仍然允许您在以后的测试中添加expect。
将以下类别添加到您的测试中,以返回OCMockObject ivar。
@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之前删除了方法的存根。
-(void)someTest{
[_vc removeStubWithName:@"removeTask"];
[[_vc expect] removeTask:OCMOCK_ANY];
[_vc removeAllTasksFromList:taskList notInList:newTaskList];
[_vc verify];
}这将允许您的测试按照您预期的方式运行。
这是一个有用的技巧,至少在OCMock开发人员允许此功能之前是这样。
https://stackoverflow.com/questions/16728686
复制相似问题