我正在使用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]
都成功通过。
有人可以解释我在这里做错了吗?
谢谢,
道格
答案 0 :(得分:1)
当用44(expected
)调用sqrt时,你告诉mock返回2(input
)。因此,result
变量将包含值2.然后,您将比较result
(2)和expected
(2),它将通过。
答案 1 :(得分:1)
您的第一次测试是测试此类测试的正确方法。没有理由嘲笑你的计算器,因为它的行为就是你正在测试的。
通常,您会模拟与您正在测试的内容正交的内容,如果您在测试中执行它们,可能会产生副作用。例如,假设您有一种计算Apple股票价格平方根的方法。您可以模拟Web服务调用以检索股票价格,因此您的测试不会进行网络调用,并且测试中的价格是静态的。然后,您将预先定义的价格传递给计算器,并验证它给出的平方根值是否正确。
至于stub
与expect
,expect
表示必须调用此方法一次。 stub
表示可能会或可能不会被呼叫,任何次数。在这两种情况下,andReturn
部分只定义在模拟上调用方法时将返回的内容。记住,模拟是愚蠢的,所以你需要告诉它要返回什么。