Mockery에서 모의, 부분, 스파이의 차이점을 기억하는 데 지치셨나요? 그래서 나는 Mockery를 더 쉽게 사용할 수 있도록 간단한 도우미 메서드인 double()
을 만들었습니다.
테스트를 작성할 때 fakes , mocks 및 spies 의 차이점에 대해 생각하고 싶지 않습니다. 저는 그냥 일반 테스트 더블을 만들고 테스트 작성에 집중하려고 합니다. 이러한 일반화는 RSpec, td.js 등과 같은 다른 테스트 프레임워크에서 일반적입니다.
최신 버전의 double()
도우미를 설치하려면 다음 명령을 실행하세요.
composer require --dev jasonmccreary/test-double
테스트 더블을 생성해야 할 때마다 간단히 double()
호출하세요.
기본적으로 double()
메소드를 스텁하고 메소드 호출을 확인할 수 있는 객체를 반환합니다.
<?php
$ td = double ();
$ td -> shouldReceive ( ' someMethod ' )-> andReturn ( 5 );
$ td -> someMethod (); // returns 5
$ td -> unstubbedMethod (); // returns null, does not throw an exception
$ td -> anotherMethod ();
$ td -> shouldHaveReceived ( ' anotherMethod ' );
Mockery에서 이 테스트 더블 은 Mockery::mock()->shouldIgnoreMissing()
또는 최신 버전에서는 Mockery::spy()
와 동일합니다.
클래스나 인터페이스에 대한 참조를 double()
전달할 수도 있습니다. 그러면 클래스를 확장하거나 인터페이스를 구현하는 테스트 개체가 생성됩니다. 이를 통해 double은 구현 시 모든 유형 힌트 또는 유형 검사를 전달할 수 있습니다.
<?php
$ td = double (Str::class);
$ td -> shouldReceive ( ' length ' )-> andReturn ( 5 );
$ td -> length (); // 5
$ td -> substr ( 1 , 3 ); // null
$ td instanceof Str; // true
$ td -> shouldHaveReceived ( ' substr ' )-> with ( 1 , 3 );
마지막으로 double()
passthru 의 두 번째 인수를 허용합니다. 기본적으로 통과는 false
입니다. true
로 설정하면 테스트 개체는 모든 메서드 호출을 기본 개체로 전달합니다.
Mockery에서 이는 Mockery::mock(Number::class)->shouldDeferMissing()
과 동일합니다.
<?php
class Number
{
public function one ()
{
return 1 ;
}
public function random ()
{
return 5 ;
}
}
$ td = double (Number::class, true );
$ td -> shouldReceive ( ' random ' )-> andReturn ( 21 );
$ td -> random (); // 21
$ td -> one (); // 1
$ td instanceof Number; // true
$ td -> shouldHaveReceived ( ' one ' );
참고: passthru는 클래스 참조를 사용하여 테스트 더블을 생성할 때만 사용할 수 있습니다. 이는 기본 구현이 존재하는 유일한 시간이기 때문입니다.
결국, double()
기본 코드에 대한 테스트 개체를 만드는 독창적인 방법입니다. 귀하의 요구 사항을 충족하지 못하는 경우 언제든지 Mockery::mock()
직접 만들 수 있습니다. 그러나 그렇게 하면 실제 동작을 반영하지 않는 방식으로 구현을 테스트하는 냄새가 날 수 있습니다. double()
MockeryInterface
를 구현하는 객체를 반환한다는 것을 기억하세요. 따라서 다른 Mockery::mock()
객체처럼 처리될 수 있습니다.