我正在努力使用使用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方法,它会停止并告诉我该行是由应用程序执行的。
你能救我吗?我不明白我做错了什么......答案 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];
}