OCMock无法识别被叫选择器

时间:2012-07-28 14:35:20

标签: objective-c unit-testing ocmock

我正在努力使用使用OCMock的测试用例。到目前为止,我在一些项目中使用了OCMock,它总是像我想象的那样工作。我有以下方法测试在设置名为[self setNeedsDisplay]的属性时调用image

- (void)testSetTapColorCallsDrawRect 
{
    SMColorButton *button = [[SMColorButton alloc] initWithImage:nil];
    id mock = [OCMockObject partialMockForObject:button];

    // Exptect setNeedsDisplay. 
    [[mock expect] setImage:OCMOCK_ANY];
    [[mock expect] setNeedsDisplay];

    button.image = [UIImage imageNamed:@"Button.png"];

    [mock verify];
}

image属性的setter看起来像这样。

- (void)setImage:(UIImage *)anImage
{
    // Set the image if it changed.
    if (anImage != image) {
        image = anImage;
        [self setNeedsDisplay];
    }
}

您可以在设置器中看到[self setNeedsDisplay]。但是当我运行测试时,我得到以下错误:

OCPartialMockObject[SMColorButton]: expected method was not invoked: setNeedsDisplay

看起来好像没有调用该方法。但是如果我设置一个断点作为setter方法,它会停止并告诉我该行是由应用程序执行的。

你能救我吗?我不明白我做错了什么......

1 个答案:

答案 0 :(得分:2)

问题是你在嘲笑你正在测试的方法setImage:。该期望拦截了调用,因此它永远不会跟随被测试类中的代码路径。尝试将测试更改为:

- (void)testSetTapColorCallsDrawRect 
{
    SMColorButton *button = [[SMColorButton alloc] initWithImage:nil];
    id mock = [OCMockObject partialMockForObject:button];    
    [[mock expect] setNeedsDisplay];

    button.image = [UIImage imageNamed:@"Button.png"];

    [mock verify];
}