[PHP] InvalidArgumentException : Unable to locate factory with name [default]

발단

Laravel Framework로 TDD를 진행중에 Unit Test를 하기 위해 artisan 콘솔을 이용하여 TaskTest 라는 이름의 테스트 클래스를 생성하였습니다.

1
$ php artisan make:test TaskTest --unit

코드는 간단했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

namespace Tests\Unit;

use App\Project;
use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\TestCase;

class TaskTest extends TestCase
{
use RefreshDatabase;

/**
* @test
*/
public function it_belongs_to_a_project()
{
$task = factory('App\Task')->create();
$this->assertInstanceOf(Project::class, $task->project);
}
}

해당 테스트를 생성 후 아래와 같이 PHPUnit으로 해당 테스트를 실행하였더니

1
$ ./vendor/bin/phpunit --filter it_belongs_to_a_project

아래 이미지와 같은 에러가 나왔습니다.

InvalidArgumentException : Unable to locate factory with name [default] [App\Task]

과연 무엇이 문제일까 싶어 해당 모델의 migration이 제대로 안된걸까요?

자세히 보기

PHPUnit Annotation 정리

서론


PHP Unit을 사용하면서도 잘 모르는 어노테이션을 PHPUnit v8.4 기준(2019-11-19 최신버전)으로 정리하였습니다.

@author

테스트를 작성자별 그룹화 필터링 할 때


@group 어노테이션의 별칭으로, 테스트를 작성자별로 그룹화하여 필터링 하는데 사용할 수 있습니다.

@after

각 테스트가 끝난 뒤 실행 하려 할 때


각 테스트 메소드들이 실행 된 후, 특정 메소드를 실행하고자 할때 사용할 수 있습니다.

각 테스트가 끝난 뒤 트랜잭션 커밋or롤백을 한다거나, 생성된 파일을 삭제하는 등의 처리를 하는데 사용하면 좋을 것 같습니다.

예제 코드
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
31
32
33
34
<?php

namespace Tests;

use PHPUnit\Framework\TestCase;

class MyTest extends TestCase
{
/**
* @after
*/
public function afterDo()
{
echo "After Method Called" . PHP_EOL;
}

public function test1()
{
echo "test1 Method Called" . PHP_EOL;
self::assertTrue(true);
}

public function test2()
{
echo "test2 Method Called" . PHP_EOL;
self::assertTrue(true);
}
}

// 출력 결과
test1 Method Called
After Method Called
test2 Method Called
After Method Called
자세히 보기