2012-07-28 57 views
0

我正在努力使用OCMock的测试用例。到目前为止,我在一些项目中使用了OCMock,它总是按照我的想法工作。当我设置一个名为image的属性时,我有以下方法测试[self setNeedsDisplay]OCMock不识别被称为选择器

- (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]在setter中被调用。但是,当我进行的测试,我得到以下错误:

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

它看起来好像方法不叫。但是,如果我使用setter方法设置断点,它会停止并向我显示该行由应用程序执行。

你能帮我吗?我没有看到我在做什么错...

回答

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]; 
} 
+0

就是这样!谢谢我没有想到,但这完全合乎逻辑。 OCMock只是检查方法是否被调用。现在测试失败/按预期运行。谢谢! – 2012-07-29 18:03:19

相关问题