티스토리 뷰
[Laravel/PHPUnit] 단위 테스트 시 A facade root has not been set 문제 해결하기 - Mockery
집사킴 2022. 10. 26. 00:54public 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값 삽입
위의 방법으로 원하는 값을 삽입할 수 있습니다.
참고
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
'Laravel' 카테고리의 다른 글
Predis를 이용하여 Laravel에서 Redis 사용하기 (0) | 2022.11.03 |
---|---|
[Laravel/PHPUnit] beforeEach 역할의 setUp() (0) | 2022.10.31 |
[Laravel/PHPUnit] Feature Test vs Unit Test (2) | 2022.10.24 |
- Total
- Today
- Yesterday
- Infra
- mongoDB
- k8s
- Container
- laravel 테스트코드
- JUnit
- 리눅스 컨테이너
- devops
- pods
- kubernetes
- MySQL
- 카프카
- index
- springboot
- NoSQL
- laravel 테스트
- mockery
- 쿠버네티스
- 분산처리
- java
- 샤딩
- docker
- 라라벨
- 대규모 데이터 처리
- database
- laravel
- kafka
- php
- 몽고디비
- phpUnit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |