0

我正在为使用 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看起来像这样。

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

你可以看到[self setNeedsDisplay]在setter中被调用。但是当我运行测试时,我收到以下错误:

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

看起来好像没有调用该方法。但是,如果我在 setter 方法中设置断点,它会停止并显示该行已由应用程序执行。

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

4

1 回答 1

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];
}
于 2012-07-29T16:02:52.447 回答