laravel勉強中です。
PHPUnitでのテストについて解決できず質問させて頂きました。
たぶん、ベテランの方からするとツッコミどころ満載なのだと思いますがご教示頂けると幸いです。
質問としては2点です。
- detailメソッドに対するassertEquals的なテストの記述がこれで良いか
- storeメソッドに対する、mockを使ったテストの記述の方法
一通りググったのですが僕が何か勘違いしているのか、求めているサンプルソースを見つけることができず質問に至っています。
テストしたいcontrollerは下記です。(念の為まるごと書きます)
PHP
1namespace App\Http\Controllers; 2 3use Illuminate\Http\Request; 4use App\Post; 5use Illuminate\Support\Facades\Validator; 6 7class PostControlloer extends Controller 8{ 9 public $post; 10 11 public function __construct(Post $post) 12 { 13 # PostオブジェクトORM 14 $this->post = $post; 15 } 16 // 17 public function index(){ 18 $posts = $this->post::all(); 19 return view('post.index',compact("posts")); 20 } 21 22 /** postsテーブルにinsertするメソッド 23 * @return App\Post 24 */ 25 public function store(Request $req) 26 { 27 // code... 28 $req->validate([ 29 "post" => "required|string", 30 "user_id" => "required|integer", 31 ]); 32 33 $this->post->storePost($req->all()); 34 return view('welcome'); 35 } 36 37 public function detail() 38 { 39 # code... 40 return true; 41 } 42} 43
テストコードはこちらです。
Tests\Unit\PostTest.php
PHP
1<?php 2 3namespace Tests\Unit; 4 5use Tests\TestCase; 6use Illuminate\Foundation\Testing\WithFaker; 7use Illuminate\Foundation\Testing\RefreshDatabase; 8use Illuminate\Foundation\Testing\DatabaseTransactions; 9use Mockery as m; 10 11class PostTest extends TestCase 12{ 13 public function tearDown() 14 { 15 m::close(); 16 } 17 18 public function setUp() 19 { 20 parent::setUp(); 21 } 22 23 /** 24 * A basic test example. 25 * 26 * @return void 27 */ 28 public function testIndex() 29 { 30 $response = $this->get('/post'); 31 $response->assertStatus(200); 32 $response->assertViewIs("post.index"); 33 } 34 35 public function testStore() 36 { 37 # Postモデルのモック 38 $postMock = $this->getMockBuilder('App\Post') 39 ->setMethods(["storePost"]) 40 ->getMock(); 41 42 # PostモデルのstorePostメソッドを呼び出すとPostのオブジェクトを返す 43 $postMock->expects($this->once()) 44 ->method("storePost") 45 ->willReturn($postMock); 46 47 #こっちの書き方も試したが失敗.. 48 #$builder = m::mock("App\Post"); 49 #$builder->shouldReceive('storePost')->andReturn($builder); 50 #$this->instance("App\Post", $builder); 51 } 52 53 public function testDetail() 54 { 55 # code... 56 $mock = $this->getMockBuilder('App\Post')->getMock(); 57 $res = new \App\Http\Controllers\PostController($mock); 58 59 $this->assertEquals(true, $res->detail()); 60 } 61} 62
【質問1】detailメソッドに対するassertEquals的なテストの記述がこれで良いか
PUPUnitについても初心者のため質問なのです。
テストは通るのですが、この記述でテストコードとして正しいのかを教えていただきたいです。
やっていることはPostController->detailメソッドの戻り値であるtrueを、testDetailでassertEqualsしているだけです。
testDetailというメソッド名にすればPHPUnitが自動でPostController->detailをテストするものと思っていたのですが、そうではないみたいなので、無理やりっぽいですが上記のように書いてみました。
記述の間違いがあればご指摘頂きたいです。
【質問2】storeメソッドに対する、mockを使ったテストの記述の方法
こちらはmockをググったサイトを参考に作ってみたのですが、
- 果たしてこの作り方で正しいのか?
- このmockを使ったcontroller->storeメソッドのテストの記述方法
この2点が分からずに困っています。
正しい記述をご教示頂けませんか?
お手数ですが、上記の2つの質問にご回答頂けると幸いですm(_ _)m
あなたの回答
tips
プレビュー