OCMock 无法识别被调用的选择器

Posted

技术标签:

【中文标题】OCMock 无法识别被调用的选择器【英文标题】:OCMock does not recognize called selector 【发布时间】: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 方法中设置断点,它会停止并显示该行已由应用程序执行。

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

【问题讨论】:

【参考方案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 只检查该方法是否被调用。测试现在按预期失败/运行。谢谢!

以上是关于OCMock 无法识别被调用的选择器的主要内容,如果未能解决你的问题,请参考以下文章

OCMock:为啥在尝试调用 UIWebView 模拟时会出现无法识别的选择器异常?

使用 LLVM ExecutionEngine 调用 Objective-C 方法时,所有选择器都无法识别

用于模拟对象的 OCMock 无法识别的选择器

以下方法无法识别 UIButton 选择器

IE 无法识别 jQuery 选择器

Angularjs验证 - 无法识别引导日期选择器输入