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

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

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

0回答

562閲覧

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

fujita222

総合スコア14

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/09/08 10:48

編集2018/09/10 12:11

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問