티스토리 뷰

728x90
public function test_주소_조회()
{
    // given
    $given = $this->create_given_data();
    $mockDao = Mockery::mock(AddressDao::Class);
    $mockDao->shouldReceive('findById')->andReturn($given->address);

    app()->instance(AddressDao::class, $mockDao);
    $addressBo = app(AddressBo::class);

    // when
    $actual = $userAddressBo->getUserAddress($given->addressId, $given->userId);

    // then
    $this->assertEquals($given->address->name, $actual['response']['data']['addressName']);
}

단위 테스트로 생성한 로직입니다.

이 테스트를 실행하면 A facade root has not been set 에러가 발생합니다.

 

단위 테스트는 서비스 컨테이너가 실행되지 않기 때문에 Facade 등 외부 인스턴스를 사용할 수가 없기 때문에 위의 에러가 발생합니다.

참고 : https://jibsakim.tistory.com/33

 

[Laravel/PHPUnit] Feature Test vs Unit Test

라라벨에서 테스트 클래스를 생성하면 TestCase 클래스를 상속받은 클래스가 생성됩니다. Feature Test냐 UnitTest냐에 따라 이 클래스의 출처(?)가 달라집니다. 단위 테스트 Unit Test 가장 작은 단위의 코

jibsakim.tistory.com

 

이를 해결하기 위해서는 Facade를 테스트 더블로 만들어야 합니다.

spy를 만들어 버리는 방법과 임의의 값을 넣는 방법이 있습니다.

저의 로직에서는 Config facade로 상수를 등록해서 사용하고 있었기 때문에 생긴 오류였기 때문에 Config를 예시로 사용해보겠습니다.

 

1. Spy로 만들기

spy() 메소드를 사용하면 facade를 간편하게 spy객체로 만들 수 있습니다

public function test_주소_조회()
{
    // given
    $given = $this->create_given_data();
    $mockDao = Mockery::mock(AddressDao::Class);
    $mockDao->shouldReceive('findById')->andReturn($given->address);

    app()->instance(AddressDao::class, $mockDao);
    $addressBo = app(AddressBo::class);
    
    Config::spy(); // config 파사드를 spy로 처리

    // when
    $actual = $userAddressBo->getUserAddress($given->addressId, $given->userId);

    // then
    $this->assertEquals($given->address->name, $actual['response']['data']['addressName']);
}

이렇게 하면 Config를 호출하여 사용하는 값을 null로 처리하게 됩니다.

{
  "message" : "success"
  "response" : {
    "statusCode" : null // config가 들어가는 부분. spy로 만들었기 때문에 null이 된다.
    "data" : {
      "addressId" : 1
      "addressName" : "배송지이름"
      "address" : "서울 강남구 역삼동"
    }
  }
}

이 테스트는 config부분이 null로 들어와도 문제가 없었기 때문에 이렇게 마무리했습니다.

 

2. 임의의 값 넣기

null이 들어가면 안 되는 경우가 있을 겁니다.

Config::shouldReceive('get') // 호출할 메소드명
	->andReturn($expectStatusCode); // 원하는 return값 삽입

위의 방법으로 원하는 값을 삽입할 수 있습니다.

Mockery에서 제공하는 다양한 API가 있으니 용도에 맞게 사용해보세요.

 

참고

https://laravel.com/docs/9.x/mocking#mocking-facades

 

Laravel - The PHP Framework For Web Artisans

Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small things.

laravel.com

 

728x90
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함