2013-06-06 4 views
0

OCMock을 사용하여 iOS와 조롱하는 속도가 빨라지고 있습니다. 나는 내가 설정 한 기대치에 근거하여 통과 할 간단한 모의 단위 테스트를 작성했다. 실패해야한다.OCMock. 왜이 시험의 두 번째 시험은 통과합니까?

// 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 유닛 테스트 sqrt 입력으로 사용 44 : 여기

코드이다. 예상 값을 2으로 설정했습니다. STAssertEquals[scientificCalculator verify] 모두 성공적으로 통과합니다.

누군가 내가 여기서 잘못하고있는 것을 설명해 주시겠습니까?

감사합니다,
더그

답변

1

당신은 SQRT 44 (input)로 호출 될 때 2 (expected)을 반환하기 위해 모의 말 했어요. 따라서 result 변수에는 값 2가 포함됩니다. 그러면 result (2)과 expected (2)을 비교하면됩니다.

+0

스텁과 모의의 차이에 대해 혼란스러워하는 것 같습니다. 나는 '기대'(mock)가 이것이 반환 된 기대 값이라는 것을 의미한다고 생각했다. 따라서 메서드가 그 값을 반환하지 않으면 무언가 잘못되었으며 확인이 실패해야합니다. 스텁이 입력에 관계없이 특정 반환 값을 적용한다고 생각했습니다. 귀하의 대답은 그들의 의미가 매우 가깝다는 것을 나타내는 것 같습니다. 나는 혼란 스럽다. – dugla

+0

Expect는 mock 객체와의 상호 작용을 확인하는 것입니다. – trydis

1

첫 번째 테스트는 이와 같은 방법으로 테스트하는 올바른 방법입니다. 계산기의 행동은 테스트하는 것이기 때문에 계산기를 조롱 할 이유가 없습니다.

일반적으로 테스트하고있는 것과 직각을 이루고 테스트에서 실행하면 부작용이있을 수 있습니다. 예를 들어 애플 주식 가격의 제곱근을 계산하는 방법이 있다고 가정 해보십시오. 주가를 검색하기 위해 웹 서비스 호출을 조롱 할 수 있으므로 테스트가 네트워크 호출을하지 않고 테스트에서 가격이 정적이됩니다. 그런 다음 미리 정의 된 가격을 계산기에 전달하고 제공 한 제곱근 값이 올바른지 확인하십시오.

에 대해 expect은이 메서드를 한 번 호출해야 함을 의미합니다. stub은 여러 번 호출 될 수도 있고 호출되지 않을 수도 있음을 의미합니다. 두 경우 모두 andReturn 부분은 방금 모의 메서드가 호출 될 때 반환 될 내용을 정의합니다. 기억하라, 모의는 바보 같으므로 무엇을 돌려 줄 것인지 말해야한다.