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

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

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

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

PHPUnit

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

Q&A

解決済

2回答

344閲覧

PHPUNITでファイル保存とDB登録でエクセプションを発生させたい。カバレッジ100%を目指して

color

総合スコア90

PHP

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

PHPUnit

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

0グッド

0クリップ

投稿2022/09/05 09:55

環境
laravel6

PHPUNITでモックの使い方詳しい方教示頂けると幸いです。
以下のコードでどうにか、例外を発生させて、catchしたいです。
理由はカバレッジのためになります。
storeAsかwhereでMockeryを使用したら出来そうな気がしているのですが、
うまくいかず、アドバイスよろしくお願いします。

PHP

1public function upload(Request $request) 2{ 3$id = Session::get('id'); 4$test_file = $request->file('file'); 5$info = pathinfo($image_file->getClientOriginalName()); 6$filename = md5(id) . '.' . $info['extension']; 7 8try { 9 $image_url = '/image/' . $filename; 10 $image_file->storeAs('image', $filename, 's3'); 11 12 CustomSetting::where('id', $id)->update([ 'custom_image_url' => $image_url, ]); 13} 14catch(\Throwable $e) { 15 Log::error('Custom image upload error : ' . $image_url); 16 Log::error($e->getMessage()); 17 return response()->json([ 'message' => 'failed', ], 500); 18} 19}

PHP

1// これじゃwhereがstaticだからダメなんですよね...多分 2$testDouble = \Mockery::mock( ImageSetting::class ); 3$testDouble->shouldReceive( 'where' )->andReturn( false );

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

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

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

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

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

guest

回答2

0

自己解決

alias:を駆使してゴニョゴニョして解決させました。

投稿2022/09/16 09:20

color

総合スコア90

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

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

0

DBのテストはインメモリSQLiteを使うのが基本。
Eloquentをモックではなく実際のDBを読み書きしてテスト。既存のDBへの影響はないしメモリ内だけで終わるのでどこにも何も残らない。
phpunit.xmlのコメントを外すだけ。
https://github.com/laravel/laravel/blob/ad219e82aa5cb350bc3828d0515820e48210e300/phpunit.xml

<env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/>

Laravel6の最終時点では最初から
https://github.com/laravel/laravel/blob/6.x/phpunit.xml

ファイルアップロードのテストはStorage::fake()とUploadedFile::fake()を使う。
https://laravel.com/docs/6.x/http-tests#testing-file-uploads

失敗するテストにはfileを送信しなければいい。tryの前に例外が発生する場合はコントローラー側のコードを変更。

php

1 $response = $this->post('/upload', [ 2 'file' => null, 3 ]);

投稿2022/09/05 11:16

kawax

総合スコア10377

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

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

color

2022/09/05 11:34

回答ありがとうございます。 多分nullじゃエラー発生しないんですよ。 また運用にのっているこーどなので、コントローラーを変更とはまず無理なんですよ。 あくまでテストこーどを追加して、かばれっじれぽーとを100%にもっていきたい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問