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

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

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

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

PHPUnit

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

Laravel 5

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

Q&A

解決済

2回答

5659閲覧

Laravelのテストでurl()->previous()に特定の値を返却させたい。モックさせたい。

hogemura

総合スコア6

PHP

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

PHPUnit

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

Laravel 5

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

0グッド

1クリップ

投稿2018/10/30 01:35

前提・実現したいこと

Laravel5.7を使ってテストを書いています。
url()->previous()もしくは\URL::previous()で返却された値によってもろもろ分岐させているので、
この返却値を指定したいです。

モックしてみたりしたんですが、エラーが出てうまくいかず、困っています。

発生している問題・エラーメッセージ

Mockery\Exception\BadMethodCallException: Received Mockery_2_Illuminate_Routing_UrlGenerator::to(), but no expectations were specified

該当のソースコード

テスト対象のメソッド

php

1class ClassName 2{ 3 function target() 4 { 5 if (\URL::previous() === '/hoge') { 6 return true; 7 } eles { 8 return false; 9 } 10 } 11}

テストコード

php

1function testTarget() 2{ 3 \URL::shouldReceive('previous') 4 ->andReturn('/hoge'); 5 $rtn = ClassName::target(); 6 $this->assertTrue($rtn); 7}

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

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

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

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

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

guest

回答2

0

自己解決

すみません、実際のコードは業務上お送りできなくて、動かしていないコードを記載していました。

対象のコードはただのmethodじゃなく、
controllerのpostを受けるmethodだったので実際には以下のような感じです。

php

1public function index(Request $request) 2{ 3 if (url()->previous()) { 4 return view('hoge1'); 5 } else { 6 return view('hoge2'); 7 } 8} 9

さて、自己解決した内容なんですが、\URL::previous()の返却値の指定は
リクエストヘッダのHTTP_REFERERを指定することでどうとでもなりました。

テストコードは以下です。

php

1$this->withHeaders([ 2 'HTTP_REFERER' => url('/'), //指定したいpreviousのurl 3 ]) 4 ->post('/') //テストurl (この場合、上記index()を呼び出すurl) 5 ->assertXXXXXX(XXXXXXX);

投稿2018/11/05 02:09

hogemura

総合スコア6

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

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

0

ファサードのモックを準備するためのshuldReceive()あたりの部分は特に問題ないように見えます。

テスト対象のメソッドの中でelseがtypoしていたりするので実際に問題の出ているコードではないのではないでしょうか。

適当に修正して以下のようにしてphpunitを実行してみましたが問題なくテストは通りました。

php

1<?php 2namespace Tests\Unit; 3 4class ClassName 5{ 6 public static function target() 7 { 8 if (\URL::previous() === '/hoge') { 9 return true; 10 } else { 11 return false; 12 } 13 } 14}

php

1<?php 2namespace Tests\Unit; 3 4use Tests\TestCase; 5 6class HogeTest extends TestCase 7{ 8 function testTarget() 9 { 10 \URL::shouldReceive('previous') 11 ->andReturn('/hoge'); 12 $rtn = ClassName::target(); 13 $this->assertTrue($rtn); 14 } 15} 16

従ってエラーの原因は別のところにあると思われます。エラーを出している部分を適切に示さないと問題の解決は難しいと思います。

投稿2018/10/30 03:37

crhg

総合スコア1175

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問