Ios 奥克莫克。为什么第二次考试通过了?

Ios 奥克莫克。为什么第二次考试通过了?,ios,unit-testing,ocmock,Ios,Unit Testing,Ocmock,我正在使用OCMock使用iOS进行模拟。我编写了一个简单的模拟单元测试,根据我设定的期望,当它应该失败时,它就会通过 代码如下: // Scientific Calculator class @implementation ScientificCalculator - (NSNumber *)sqrt:(NSNumber *)input { return [NSNumber numberWithDouble:sqrt([input doubleValue])]; } @end /

我正在使用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
statsertequals
[科学计算器验证]
都成功通过

有人能解释一下我做错了什么吗

谢谢,

Doug

您已经告诉mock在使用44(
输入
调用sqrt时返回2(
预期的
)。因此,
result
变量将包含值2。然后比较
结果
(2)和
预期结果
(2),结果将通过。

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

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


对于
stub
expect
expect
意味着必须调用此方法一次<代码>存根表示它可以被调用,也可以不被调用,调用次数不限。在这两种情况下,
andReturn
部分仅定义在模拟上调用该方法时将返回的内容。记住,mock是哑的,所以你需要告诉它返回什么。

我似乎对存根和mock之间的区别感到困惑。我认为“expect”(mock)意味着这是返回的预期值。因此,如果该方法不返回该值,则会出现错误,验证将失败。我认为存根强制执行一个特定的返回值,而不考虑输入。你的回答似乎表明它们的语义非常接近。我很困惑。Expect用于验证与模拟对象的交互。