2013-10-18 5 views
0

구성 요소에 대한 단위 테스트를 작성 중이며 일부 데이터를 위조하는 데 문제가 있습니다. 다른 클래스의 클래스를 참조 할 수 있는지 궁금합니다. 셋업의단위 테스트 - 클래스 '클래스'참조 변수

예 :

Unit Test > Human > Sports > $this->option['duration'] 

내 인간 클래스에 대한 단위 테스트를 쓰고 있어요. Human 클래스는 Sports 클래스를 호출하고 Sports 클래스는 자체 변수 $this->option['duration']을 참조합니다. 내 단위 테스트에서 $this->option['duration']의 값을 수정할 수 있기를 원합니다. 이것이 가능한지 궁금합니다.

내 단위 테스트에서 스포츠 모의 수업을 만들고이 모의 수업에서 원하는 값을 $this->option['duration'] (으)로 설정하려고했습니다. 그러나 내 모의목 테스트에 내 모의 스포츠 반을 주입하는 법을 모릅니다.

class SportsMock extends Sports { 
    $this->option[duration'] = 10; 
} 

답변

1

이러한 종류의 조롱을 사용하려면 수업에 의존성 주입 (DI)이 가능해야합니다.

내 말은 휴먼 클래스는 스포츠를 인스턴스화해서는 안되며 생성자에서 또는 더 나은 방법은 설정 메소드를 통해 받아 들여야합니다. 이렇게하면 조롱 된 클래스를 쉽게 만들고 인스턴스화하고 테스트 할 클래스의 인스턴스에 주입 할 수 있습니다.

class Human { 
    /* ... */ 
    function setSports(Sports $sports) { 
     $this->sports = $sports; 
     return $this; 
    } 
    /* ... */ 
} 

테스트에서는 스포츠에서 연장되어 설정자와 작업 할 수 있습니다.

/* You can override any function in the original, to return some mock data */ 
class MockSports extends Sports { 
    public $mock_data = array(); 
    function original_function() { 
     return $mock_data['original_function']; 
    } 
} 

이 일반적으로 더욱 편리 조롱 수 있도록 적절한 조롱 유틸리티와 함께 ​​도서관을 테스트, 사용자의 요구에 잘 작동 수도 있지만,이 DI가 훨씬 쉽게 테스트 할 수 있다는 사실을 변경하지 않습니다 비록 당신의 암호.

예 :

function my_example_test() { 
    $human = new Human(); 
    $mock_sports = new MockSports(); 
    $mock_sports->mock_data['original_function'] = 10; 
    $human->setSports($mock_sports); // <-- here is the injection 
    /* Below you can test if your human works like it should */ 
} 
+0

가 어떻게'SportsMock'를 사용하는'Human'을 알 수 있습니까? – Jon

+0

@ icu222 테스트 케이스에 주입 용 예제가 많이 추가되었습니다. – aorcsik

+0

Got'cha. 이제 setter 메소드'setSports()'를 사용하여 여러분이 의미하는 바를 이해합니다. 불행히도 내 Human 클래스에는'setSports()'가 없습니다. 대신'$ sport = new Sports();를 통해 Sports 클래스를 생성합니다. return $ sport-> getHtml ($ data);'. – Jon

관련 문제