2013-04-02 1 views
3

단위 테스트를 위해 예측 가능성이 높은 Arrange Act Assert format을 선호합니다. 키위는 모의 객체에 대한 명시 적으로 확인 문이 없기 때문에키위 모크에서 확인 방법이 부족한 경우 해결 방법이 있습니까?

, 그것은 다른 패턴을 강제로 뭔가 같은 :

// Arrange 
Thing *mockThing = [CollaboratingClass mock]; 
TestedClass *sut = [[TestedClass alloc] initWithCollaborator:mockThing]; 

// Expect (collaboration expectations) 
[[[mockThing should] receive] someMessage]; 

// Act 
[mockArray someMethodInvolvingCollaborator]; 

// Assert (state expectations) 
[[sut.someProperty should] equal:someValue]; 

나는 검증 어쨌든 일어나는 것을 알고 있지만, 신속하게 테스트를 스캔 할 수있는 선호 주장과 기대가 하나의 예측 가능한 장소에 함께 있습니다. 이는 mockito (및 Objective-C 구현 OCMockito)에 의해 올바르게 활성화됩니다. 여기서 확인 단계에서는 메서드 호출을 임시 지정하여 이전 예상 단계를 필요로하지 않습니다.

저는 상대 키위녀입니다. 따라서 문서에서 뭔가를 놓친 것 같습니다. 명시 적으로 키위 모의를 확인하는 방법이 있습니까?

답변

4

당신에 대한 법 어설이이 패턴의 혜택 (강조 추가)에 대해 말해야하는 배열에서 제공하는 링크 :

장점 : ...

  • 차종을
    • "Act"코드와 섞인 어설 션. 당신의 목표는 신속하게 주장을 스캔 할 수있다 특히 경우

한 번에 너무 많은 다른 것들을 테스트하려고

  • 시험 방법은, 당신의 예를 더 잘 헤어 졌 될 것이라고 생각 협업 테스트 및 객체 상태 변경 방법에 대한 별도의 테스트 등 두 가지 테스트 케이스로 구분됩니다.

    사실 제 4 단계가 있습니다. 여기에는 협력 테스트에만 해당되는 Expect입니다. 키위는 배열, 예상, 동작, 여기서 OCMock은 을 요구하여 어설 션 단계를 네 번째로 추가해야합니다.

    나는이 이러한 테스트를 설정하는 더 나은 방법이 될 것이라고 생각 :

    __block TestedClass *sut; 
    beforeAll(^{ 
        sut = [[TestedClass alloc] initWithCollaborator:mockThing]; 
    } 
    
    // Collaboration: Arrange, Expect, Act 
    it(@"sends someMessage to mockThing", ^{ 
        // Arrange 
        Thing *mockThing = [CollaboratingClass mock]; 
    
        // Expect 
        [[[mockThing should] receive] someMessage]; 
    
        // Act 
        [mockArray someMethodInvolvingCollaborator]; 
    } 
    
    // State: Arrange, Act, Assert 
    it(@"sets someProperty to the return value of someMethod", ^{ 
        // Arrange 
        NSString *expectedString = @"foo"; 
        Thing *mockThing = [CollaboratingClass mock]; 
        [[mockThing stubAndReturn:expectedString] someMessage]; 
    
        // Act 
        [mockArray someMethodInvolvingCollaborator]; 
    
        // Assert 
        [[sut.someProperty should] equal:expectedString]; 
    } 
    

    그리고이 설치를 얻을 이점은 혹시 협력자의 반환 값에 따라 분기를해야하는 경우 단지 다른 결과를 반환 할 someMethod을 스터브 다른 테스트를 추가하고, 다른 주장 할 수 있습니다 :

    it(@"sets someProperty to nil if someMethod returns baz", ^{ 
        // Arrange 
        Thing *mockThing = [CollaboratingClass mock]; 
        [[mockThing stubAndReturn:@"baz"] someMessage]; 
    
        // Act 
        [mockArray someMethodInvolvingCollaborator]; 
    
        // Assert 
        [sut.someProperty shouldBeNil]; 
    } 
    

    가 궁극적으로 내가 키위는 우리의 테스트 복식 verify 우리를 필요로하지 않음으로써 우리에게 부탁을하고 있다고 생각합니다.

  • +0

    사려 깊은 반응에 감사드립니다. 필자의 예는 논리적으로 두 가지 별도의 테스트라고 전적으로 동의합니다. 그러나 나는 키위 접근 방식의 장점에 대해서는 여기 팔리지 않았다.그것은 테스트의 실제 고기 (기대/주장)가 다르게 배치되어있는 협업 테스트와 다른 패턴 (AEA 대 AAA)을 가진 상태 별 테스트를 초래합니다. 그것은 빠른 스캐닝에 비합리적입니다. 확인 단계는 OCMock을 사용하여 중복 될 수 있지만 OCMockito와는 중복 될 수 있습니다. OCMockito는 내가 생각하기에 가장 좋은 전반적인 패턴을 생생하게 나타냅니다. (명확히하기 위해 질문을 편집 할 것입니다.) – Cris

    +0

    왜 대답을했는지에 대해 받아 들였습니다 '아니오'(이는 어떤 질문에 대해서도 완벽하게 좋은 답변 임)입니다. 나는 키위의 접근 방식을 여전히 좋아하지 않는다. 그러나 그것은 단지 맛이다. – Cris

    +0

    답변을 수락 해 주셔서 감사합니다. 나는 최근에 이것에 대해 조금 생각해 왔고, 가장 좋은 접근법이 무엇인지 궁금해했습니다. 키위가 어느 쪽인가의 접근을 허용했다면 확실히 좋을 것이고 필요하다면 사후 정당화를 통해 명시 적으로 검증하게 할 것이다. –

    관련 문제