2013-09-26 4 views
10

$this->call($destination, $parameters, 'GET');を使用してコントローラをテストすることに関する多くのドキュメントを読んだことがありますが、これは設定されているルートに依存しているように見え、$destinationつかいます。ルートをテストせずにLaravelのコントローラを単体テストする最善の方法は

一般的にこれは問題ありませんが、ルートからコントローラにアクセスすることは単体テストには適していません。私は、ルートではなくコントローラを単体テストしたい。ルートを扱わないでユニットテストコントローラへの標準的な方法はありますか?

コントローラーを手動でインスタンス化してメソッドを呼び出すだけですか?例えば。

$controller = new MyController; 
$response = $controller->someMethod($param); 
$this->assertSomething($response); 

はおそらく、コントローラは、ユニットがテストされるべきではない(とのみ受け入れテストを持っている)と私の要求は私のコントローラが重すぎているサインです。あなたが直接あなたの行動を呼び出すことができます

+1

から可能な削除されました。私はララベルをよく知っているわけではありませんが、あなたが自分自身で試すことができる最初の質問です。コントローラ1をインスタンス化するだけです。 Laravelに関係するサービスコンテナがいくつかあり、コントローラがそれを利用する場合は、あなたが模擬する必要があるいくつかの共同作業者がいるかもしれませんが、TestCaseでそれをカプセル化して、よりハンサムな。しかし、テストを書くことはコードを書くことと似ていますが、それがうまくいくなら試してみる必要があります。 – hakre

+0

コントローラをインスタンス化することはこれまでのところうまくいくように思えますが、私はそれが "ララベルのやり方"ではないと心配しています。私はLaravel'sからテストケースを拡張しています。これは自動的に "app" DICを設定します。 – dave1010

+1

DICアプリにテストダブルを設定すると、これはおそらくテストでは問題ありません。もしそうでなければ、物事は怪物になるかもしれない。あなたはおそらくLaravel IRCのチャットでこれについて少し議論するべきです、私はこのようなフィードバックがそこに求められていると思います。そこにいる人々は、ララベルについてさらに詳しく話すことができるはずです。 – hakre

答えて

12

$response = $this->action('GET', 'Ord[email protected]', ['id' => 1]); 
+0

これは良いステップです。私は正しいHTTPメソッド(例えば 'GET')を知っていなければなりませんか? – dave1010

+0

はい、testcaseのアクションメソッドにはHTTPメソッドが必要です。テストでは徹底的に行う必要があります。 –

+1

私の主張は、コントローラ(例えば、 'OrdersController :: show()')がルートのHTTPメソッドに結合されるべきではないということです。 – dave1010

3

action方法はたぶん、おそらくLaravel 5.4 testing api

関連する問題