【问题标题】:OCMock does not recognize called selectorOCMock 无法识别被调用的选择器
【发布时间】:2012-07-28 14:35:20
【问题描述】:

我正在为使用 OCMock 的测试用例而苦苦挣扎。到目前为止,我在几个项目中使用了 OCMock,它总是按我的想法工作。我有以下方法来测试当我设置一个名为image 的属性时是否调用了[self setNeedsDisplay]

- (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 方法中设置断点,它会停止并显示该行已由应用程序执行。

你能帮帮我吗?我看不出我做错了什么......

【问题讨论】:

    标签: objective-c unit-testing ocmock


    【解决方案1】:

    问题是你在嘲笑你正在测试的方法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];
    }
    

    【讨论】:

    • 就是这样!谢谢,我没有考虑过,但这完全合乎逻辑。 OCMock 只检查该方法是否被调用。测试现在按预期失败/运行。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多