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

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

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

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

PHPUnit

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

Laravel 5

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

Q&A

解決済

1回答

4024閲覧

ファサードがある場合のLaravel5のユニットテストの書き方

nasu

総合スコア81

PHP

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

PHPUnit

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

Laravel 5

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

0グッド

1クリップ

投稿2016/05/25 11:37

オリジナルで作成したファサード「Common」「Price」という2つのクラスがあります。

今回は「Price」クラスのunittestを行う際の問題です。
Priceクラスの中で、Commonクラスを使っています。
以下、大幅に簡略化しています。

PHP

1use Common; 2Class Price { 3 public function abc($ary) { 4 $value = Common::config('xxx'); 5 $ary[] = $value; 6 } 7}

PriceクラスのUnittestで、上記のCommon::config('xxx')を呼び出すところで以下のエラーが発生します。

ErrorException: Non-static method App\Modules\Common::config() should not be called statically, assuming $this from incompatible context

そこでMockeryというものを使えば解消出来るような情報を見つけたのですが、いまいち使い方がわかりません。
いくつかのサイトの情報などをみながら書いてみましたが、エラーは変わらずです。
Common::shouldReceive('config')->once()->with('xxx')->andReturn('value');

・使い方が間違っている
・使うための手続きが間違っている(足りていない)
・根本が違う

などなど、ご指摘・ご指導お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラー文を見る限りCommonクラスの'config'を定義するときにstaticにしてねってことだと思いますよ。
何かstaticできない理由等があるのでしょうか。
該当箇所のコードがあればもう少し違う角度の回答がつくかもしれません。


上記の回答は完全に的外れです、恥ずかしいですがこのまま残して置きます。

「Mockery」の使い方に関してですが「Mockery」を使ってサクッとPHPのテストを書いてみる | アライドアーキテクツ エンジニアブログを見た感じではCommonクラスのモックを作成してテストを行うようですので

php

1use \Mockery as M; 2() 3$commonMock = M::mock('alias:Common'); 4$commonMock->shouldReceive('config')->andReturn('value');

のような感じで$commonMock(Commonのモック)を作成する使い方かと思います。

投稿2016/05/25 12:13

編集2016/05/25 13:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nasu

2016/05/25 12:55

回答ありがとうございます。 いただいた内容に対しての質問なのですが、 staticにしてね ではなく、staticで呼ぶべきではない じゃないでしょうか? ファサードにしているのでこのような問題になるのは、理解してるのですが、testする場合の回避、対応方法がよくわからずに困っております。
退会済みユーザー

退会済みユーザー

2016/05/25 13:10

あーお恥ずかしい・・・申し訳ございません。 Mockeryを少し調べてみましたので回答追記します。
nasu

2016/05/26 03:55

回答ありがとうございました。 教えていただいたサイトを参考に無事実装できました。 Laravelを起点に調べていたのですが、当該サイトのような情報をなかなか見つけられず困っていたので助かりました。 (検索が下手なだけかもしれませんが・・・)
退会済みユーザー

退会済みユーザー

2016/05/26 04:50

実装できたようでよかったです。 参考になるかわかりませんが今回のケースだと重要なのは「Laravel」ではなくて「unittestの時にstatic」をどうするかということなので「Mockery」でいけそうって情報をみたら「Mockery static」で検索してLaravelは一旦外してしまう感じでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問