0

我正在加快使用 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我将预期值设置为2. 两者都STAssertEquals顺利[scientificCalculator verify]通过。

有人可以解释一下我在这里做错了什么吗?

谢谢,
道格

4

2 回答 2

1

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

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

对于stubvs. expectexpect意味着这个方法必须被调用一次。stub表示它可能会或可能不会被调用任意次数。在这两种情况下,该andReturn部分仅定义在您的模拟上调用该方法时将返回的内容。请记住,模拟是愚蠢的,因此您需要告诉它要返回什么。

于 2013-06-07T15:38:43.533 回答
1

expected当使用 44 ( ) 调用 sqrt 时,您已经告诉模拟返回 2 ( input)。因此,该result变量将包含值 2。然后您将比较result(2) 和expected(2),结果将通过。

于 2013-06-06T23:12:58.173 回答