OCMock。为什么第二次测试通过?

时间:2013-06-06 22:51:52

标签: ios unit-testing ocmock

我正在使用OCMock开始使用iOS进行模拟。我写了一个简单的模拟单元测试,它根据我设置的期望传递 - 它应该失败。

以下是代码:

// Scientific Calculator class
@implementation ScientificCalculator

- (NSNumber *)sqrt:(NSNumber *)input {
    return [NSNumber numberWithDouble:sqrt([input doubleValue])];
}

@end

// unit test
-(void) testScientificCalculatorSqrt {

    NSNumber *input = [NSNumber numberWithDouble:4];
    ScientificCalculator *scientificCalculator = [[ScientificCalculator alloc] init];

    NSNumber *expected = [NSNumber numberWithDouble:2];

    NSNumber *result = [scientificCalculator sqrt:input];

    STAssertEquals([result doubleValue], [expected doubleValue], nil);

}

// unit test
-(void)testScientificCalculatorMocking {

    // setup
    NSNumber *input = [NSNumber numberWithDouble:44];
    id scientificCalculator = [OCMockObject mockForClass:[ScientificCalculator class]];

    // expect
    NSNumber *expected = [NSNumber numberWithDouble:2];
    [[[scientificCalculator expect] andReturn:expected] sqrt:input];

    // test
    NSNumber *result = [scientificCalculator sqrt:input];

    // verify
    STAssertEquals([result doubleValue], [expected doubleValue], nil);

    [scientificCalculator verify];
}

testScientificCalculatorMocking单元测试使用44作为sqrt的输入。我将期望值设置为2STAssertEquals[scientificCalculator verify]都成功通过。

有人可以解释我在这里做错了吗?

谢谢,
道格

2 个答案:

答案 0 :(得分:1)

当用44(expected)调用sqrt时,你告诉mock返回2(input)。因此,result变量将包含值2.然后,您将比较result(2)和expected(2),它将通过。

答案 1 :(得分:1)

您的第一次测试是测试此类测试的正确方法。没有理由嘲笑你的计算器,因为它的行为就是你正在测试的。

通常,您会模拟与您正在测试的内容正交的内容,如果您在测试中执行它们,可能会产生副作用。例如,假设您有一种计算Apple股票价格平方根的方法。您可以模拟Web服务调用以检索股票价格,因此您的测试不会进行网络调用,并且测试中的价格是静态的。然后,您将预先定义的价格传递给计算器,并验证它给出的平方根值是否正确。

至于stubexpectexpect表示必须调用此方法一次。 stub表示可能会或可能不会被呼叫,任何次数。在这两种情况下,andReturn部分只定义在模拟上调用方法时将返回的内容。记住,模拟是愚蠢的,所以你需要告诉它要返回什么。