如何从OCMock开始并检查是否调用了方法

时间:2013-11-30 22:18:14

标签: ios objective-c unit-testing tdd ocmock

我试图处理OCMock。我创建了简单的类MyClass

@interface MyClass : NSObject
- (NSString *)simpleMethod;
@end

@implementation MyClass

- (NSString *)simpleMethod {
    [self method];
    return @"simple";
}

- (void)method {
    NSLog(@"ABC");
}

@end

我想检查的是,在调用method时是否调用了方法simpleMethod。现在我已经获得了以下代码,但它不起作用:

- (void)testMethodInvoked
{
    id mock = [OCMockObject mockForClass:[MyClass class]];
    [[mock stub] simpleMethod];

    SEL selector = NSSelectorFromString(@"method");
    [[mock expect] methodForSelector:selector];
    [mock verify];
}

我应该如何测试这个案例?我认为这很容易做到,但我不知道如何解决这个问题。

如何创建调用方法simpleMethod的模拟和调用方法method

当前日志:

<unknown>:0: error: -[OCMockTestTests testOne] : OCMockObject[MyClass]: expected method was not invoked: methodForSelector:@selector(method)

2 个答案:

答案 0 :(得分:15)

您永远不会实际创建要测试的类的对象。此外,您必须先expect,然后调用方法:

- (void)testMethodInvoked
{
    // first create an object that you want to test:
    MyClass *object = [[MyClass alloc] init];
    // create a partial mock for that object
    id mock = [OCMockObject partialMockForObject:object];
    // tell the mock object what you expect
    [[mock expect] method];
    // call the actual method on the mock object
    [mock simpleMethod];
    // and finally verify
    [mock verify];
}

答案 1 :(得分:4)

我有时发现测试“私有”方法/实现很有用 - 如果它破坏了某种正统的话,也许不要把它称为单元测试 - 但是对于复杂的实现我可能想要验证更多的行为粒度级别比通过外部接口。

无论如何,我将通过在测试类中创建一个类来公开类扩展方法:

@interface MyClass (ExposeForTest)
- (void)method;
@end

- (void)testMyClass
{
   id mock = [OCMockObject mockForClass:MyClass.class];
   [[mock expect] method];
   [mock simpleMethod];
}