Open10
Laravel PHPUnit
Requestのモックを作成したい
RequestオブジェクトをMockで作ってはいけないとのこと。
テストを実行するときは、getやpostなどのHTTP helper methodsへ望む入力を渡すと書かれているが
Requestオブジェクトを引数にしているメソッドのテストはどう書けばよいかわからなかった。
結局Requestオブジェクトは渡さずにGETパラメータをひとつずつメソッドに渡す形にしました。
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」を読み込むように修正し正常動作するようになった。
各テストの後にデータベースをリセットする
use RefreshDatabase;
- seederファイルは基本テーブル単位
例外・エラー処理
serviceproviderで依存を解消する
- コントローラのテストは、FeatureにてHTTPテストで行う
- サービスプロバイダで依存を解消できるものはその形でも
- どこで生成されているのか分かりづらくなってしまうのでモック利用するような部分のみ使うべきか
- https://github.com/dweidner/laravel-goutte
- サービスコンテナでテスト対象のクラス内で生成しているインスタンスのメソッドの返り値を指定できる
- スパイとは:メソッドの呼び出し情報(コール回数など)を記録し、テスト対象の実行後にアサートできるようにするもの
https://readouble.com/laravel/8.x/ja/mocking.html