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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

2回答

3673閲覧

Mockeryで__invokeメソッドをモックしたい

hashibata

総合スコア18

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2019/06/27 10:56

編集2019/06/27 11:00

お世話になります。

LaravelとMockeryの組み合わせで、今回の希望が叶わず、質問しました。

テストケースにて、以下のコードに対するモックを作成することで
通常とは異なる動作をさせて、以下の2点を満たしたいのです。

・DIインジェクションされたSearchにはモックされたSearchを渡したい

・Searchの戻り値をoneからtwoに変更したい。

php

1<?php 2use \Some\Place\Search; 3 4final class HogeRepository 5{ 6 public function __constract( 7 Search $search 8 ) { 9 $this->search = $search; 10 } 11 12 public function some() { 13 $value = ($this->search)(); 14 // 普通はここでoneが返るはずだが、Mockeryを使ってtwoを返るようにしたい。 15 } 16} 17 18class Search 19{ 20 public function __invoke() 21 { 22 return "one"; 23 } 24}
Mockery::Mock("\Some\Place\Search") ->shouldReceive('__invoke') ->andReturn('two');

このように書けばいいのかなと思ったのですが、oneが返ってきてしまいます。

頭を抱えてしまいまして、何卒よろしくお願いします。

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

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

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

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

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

Stripe

2019/06/27 12:41

テストケースそのものを掲載してください。
guest

回答2

0

mockeryのissueの以下あたりが参考になるかもしれません。
Mocking invokable classes

投稿2019/06/27 16:42

aro10

総合スコア4106

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

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

hashibata

2019/07/02 01:48

ありがとうございます。調査する際に、その記事にも目を通しました。書いてある対応を行ったのですが、解決しませんでした。
guest

0

自己解決

モック処理を行う場所を間違えておりました。

<?php declare(strict_types=1); namespace xxx; use Tests\TestCase; class GetListTest extends TestCase { private $repository; private $getList; public function setUp(): void { //...① $hogeRepository = $this->app->make(HogeRepository::class); $this->getList = new GetList($hogeRepository); } /** * @test */ public function 空のリストを返すか確認する() { //...② $actual = ($this->getList)(); $this->assertSame(0, $actual->count()); }

Setup:
1. 挿入ポイント①
2. リポジトリを作ろうとする
3. Repositoryのコンストラクタが走る
(このときにコンストラクタインジェクションでいろいろ渡ってくる)
4. 作ったリポジトリをユースケースにセットする

TestCase:
5. 挿入ポイント②
6. ユースケースを使う

いままでコンストラクタインジェクションの時、モックされたオブジェクトに
差し替えようと②の所で一生懸命やっていましたが
①のコンストラクタインジェクションの前段階でモックしてなければ、差し替わらないですね。

ありがとうございます。

投稿2019/07/02 01:47

hashibata

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問