Open10

Laravel PHPUnit

Requestのモックを作成したい

RequestオブジェクトをMockで作ってはいけないとのこと。
テストを実行するときは、getやpostなどのHTTP helper methodsへ望む入力を渡すと書かれているが
Requestオブジェクトを引数にしているメソッドのテストはどう書けばよいかわからなかった。

結局Requestオブジェクトは渡さずにGETパラメータをひとつずつメソッドに渡す形にしました。

https://akamist.com/blog/archives/4144
https://qiita.com/sutara79/items/81cf687588c00df0f847
https://blog.shimabox.net/2020/05/24/laravel-testing_classes_that_depend_on_the_request_class/
class BookSearchController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
         $results = (new BookSearchAction())->handle($request);       
    }
}

下記試してみるもエラーになり動かずでした。

protected function createRequest(
    $method,
    $content,
    $uri = '/test',
    $server = ['CONTENT_TYPE' => 'application/json'],
    $parameters = [],
    $cookies = [],
    $files = []
) {
    $request = new \Illuminate\Http\Request;
    return $request->createFromBase(
        \Symfony\Component\HttpFoundation\Request::create(
            $uri,
            $method,
            $parameters,
            $cookies,
            $files,
            $server,
            $content
        )
    );
}

RuntimeException: A facade root has not been set.

「RuntimeException: A facade root has not been set.」というエラーが発生。
PHPUnit\Framework\TestCaseだとファサードを動かすことが出来ずエラーになるため
「Tests\TestCase」を読み込むように修正し正常動作するようになった。

https://qiita.com/aminevsky/items/784573234d071c769288

各テストの後にデータベースをリセットする

use RefreshDatabase;
  • コントローラのテストは、FeatureにてHTTPテストで行う
  • サービスプロバイダで依存を解消できるものはその形でも
  • サービスコンテナでテスト対象のクラス内で生成しているインスタンスのメソッドの返り値を指定できる
  • スパイとは:メソッドの呼び出し情報(コール回数など)を記録し、テスト対象の実行後にアサートできるようにするもの
    https://readouble.com/laravel/8.x/ja/mocking.html
ログインするとコメントできます