2017-11-21 3 views
1

내가 개발 단계에서 현재 API를 테스트하는 단위 테스트를 쓰고 있어요

시나리오에서 $이를 통해 참조. 나는 모의 컨테이너 클래스 (데코레이터 패턴)를 가지고 있는데, 실제 객체에 대한 호출 대신 실행되는 mock 배열을 포함하고있다.가로 채기 함수 호출은 단위 테스트

이러한 모의 용기는 테스트 실행 중에 DI 컨테이너에 놓여지고 호출은 모델/컨트롤러 대신 컨테이너에 부딪칩니다. 대부분의 경우 컨트롤러 기능을 사용할 수 있지만 가끔씩 조롱하려고합니다. 모의 컨테이너는 __call을 통해 액세스 할 수없는 함수 호출을 포착하고 할당 된 모의 데이터를 반환하거나 내부 객체를 치는 방식으로 작동합니다.

문제점

이의 사용 케이스에 잘 작동 : c['Controller_Name']으로

$this->c['Controller_Name']->functionHere()

우리의 모의 컨테이너의 인스턴스이지만,이 방법의 문제는 자신을 참조하는 컨트롤러에서 온다 functionHere을 조롱해야 할 때 $this->functionHere()을 통해 전달되지만, 모의 컨테이너가 아닌 컨트롤러의 인스턴스 인 $this에서 호출이 발생합니다.

은 자신의 회원 클래스에 호출을 차단하기위한 그럴듯한 방법이있다, 그래서 당신은 의존성 삽입 (Dependency Injection)를 사용하는 것처럼 나는 $this->functionHere()을 잡아 구체적인 얘기를 하드 셋업을 모른 채 $this->c['Controller_Name']->functionHere()

답변

1

로 적절하게 번역 할 수 있지만, 테스트에서 제외하고자하는 구현을 인터페이스하도록 보장한다면, 예를 들어 별도의 TestDIModule을 사용하여 매핑 된 모의 버전을 만들 수 있다는 것을 의미합니다. 그렇게하면 아무 것도 가로 채지 않아도됩니다.

개체 내에서 함수 호출을 잡는 방법에 관해서는이 작업을 수행해야 할 경우 클래스가 여러 "작업 단위"를 수행하고 있음을 나타낼 수 있으므로 별도의 클래스로 리팩토링하고 인터페이스 할 수 있음을 제안합니다. 위에 설명 된 것처럼 이들을 인터페이스로 추출하면 이들을 조롱하고 독립적으로 테스트 할 수 있습니다.