質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.11%

laravel5.5のphpunitでcontrollerをテストする方法について

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,244

fujita222

score 11

laravel勉強中です。

PHPUnitでのテストについて解決できず質問させて頂きました。
たぶん、ベテランの方からするとツッコミどころ満載なのだと思いますがご教示頂けると幸いです。

質問としては2点です。

  • detailメソッドに対するassertEquals的なテストの記述がこれで良いか
  • storeメソッドに対する、mockを使ったテストの記述の方法

一通りググったのですが僕が何か勘違いしているのか、求めているサンプルソースを見つけることができず質問に至っています。


テストしたいcontrollerは下記です。(念の為まるごと書きます)

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;
use Illuminate\Support\Facades\Validator;

class PostControlloer extends Controller
{
    public $post;

    public function __construct(Post $post)
    {
        # PostオブジェクトORM
        $this->post = $post;
    }
    //
    public function index(){
        $posts = $this->post::all();
        return view('post.index',compact("posts"));
    }

    /** postsテーブルにinsertするメソッド
    *  @return App\Post
    */
    public function store(Request $req)
    {
        // code...
        $req->validate([
            "post" => "required|string",
            "user_id" => "required|integer",
        ]);

        $this->post->storePost($req->all());
        return view('welcome');
    }

    public function detail()
    {
        # code...
        return true;
    }
}

テストコードはこちらです。
Tests\Unit\PostTest.php

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Mockery as m;

class PostTest extends TestCase
{
    public function tearDown()
    {
        m::close();
    }

    public function setUp()
    {
        parent::setUp();
    }

    /**
     * A basic test example.
     *
     * @return void
     */
    public function testIndex()
    {
        $response = $this->get('/post');
        $response->assertStatus(200);
        $response->assertViewIs("post.index");
    }

    public function testStore()
    {
        # Postモデルのモック
        $postMock = $this->getMockBuilder('App\Post')
                            ->setMethods(["storePost"])
                            ->getMock();

     # PostモデルのstorePostメソッドを呼び出すとPostのオブジェクトを返す
        $postMock->expects($this->once())
                    ->method("storePost")
                    ->willReturn($postMock);

        #こっちの書き方も試したが失敗..
        #$builder = m::mock("App\Post");
        #$builder->shouldReceive('storePost')->andReturn($builder);
        #$this->instance("App\Post", $builder);
    }

    public function testDetail()
    {
        # code...
        $mock = $this->getMockBuilder('App\Post')->getMock();
        $res = new \App\Http\Controllers\PostController($mock);

        $this->assertEquals(true, $res->detail());
    }
}

 【質問1】detailメソッドに対するassertEquals的なテストの記述がこれで良いか

PUPUnitについても初心者のため質問なのです。
テストは通るのですが、この記述でテストコードとして正しいのかを教えていただきたいです。

やっていることはPostController->detailメソッドの戻り値であるtrueを、testDetailでassertEqualsしているだけです。

testDetailというメソッド名にすればPHPUnitが自動でPostController->detailをテストするものと思っていたのですが、そうではないみたいなので、無理やりっぽいですが上記のように書いてみました。

記述の間違いがあればご指摘頂きたいです。

 【質問2】storeメソッドに対する、mockを使ったテストの記述の方法

こちらはmockをググったサイトを参考に作ってみたのですが、

  • 果たしてこの作り方で正しいのか?
  • このmockを使ったcontroller->storeメソッドのテストの記述方法

この2点が分からずに困っています。
正しい記述をご教示頂けませんか?

お手数ですが、上記の2つの質問にご回答頂けると幸いですm(_ _)m

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる