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

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

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

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

PHP

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

PHPUnit

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

Q&A

解決済

2回答

1481閲覧

LaravelでphpUnitでsetUp()追加するとコンパイルエラーが出る

donut4

総合スコア148

Laravel

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

PHP

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

PHPUnit

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

0グッド

0クリップ

投稿2021/06/06 15:05

編集2021/06/06 18:29

LaravelでphpUnitを書いています。

最初にsetUp()でDB関係のクラスをnewしてクラス変数を作って、
$this->drinkRepository = new DrinkRepository();
$lastId = $this->drinkRepository->all()->last()->id;
を一つにまとめたいのですが、setUp()を追加してもコンパイルエラーに失敗して困ってます。

詳しい方、よろしくお願いします。

##ソースコード

<?php declare(strict_types=1); namespace Tests\Unit\Services\Drink; use App\Exceptions\Drink\Buy\GuiltyException; use App\Exceptions\Drink\Buy\NoStockException; use App\Exceptions\Drink\Buy\NotEnoughMoneyException; use App\Exceptions\Drink\NotFoundException; use App\Models\User; use App\Services\Drink\DrinkService; use App\Models\Drink; use App\Repositories\DrinkRepository; use App\Repositories\UserRepository; use Tests\TestCase; class DrinkServiceBuyTest extends TestCase { /** * @testdox 在庫が0以下の場合, NoStockExceptionをスロー * @throws NotFoundException */ public function test_buy_should_throws_no_stock_exception_if_stock_0_or_less(): void { $this->expectException(NoStockException::class);//期待する例外 $this->drinkRepository = new DrinkRepository();//外だしして各メソッドの無駄を無くしたい $lastId = $this->drinkRepository->all()->last()->id;//外だしして各メソッドの無駄を無くしたい $this->drinkRepository->newDrink( new Drink($lastId+1, "テストドリンク", 100, 0, false)//テストデータ挿入 ); $user = new User(1, 'テストユーザー', 20, 100); (new DrinkService())->buy($user, $lastId+1); } /** * @testdox 返り値がnullだった場合, NotFoundExceptionをスロー * @throws NotFoundException */ public function test_buy_should_throws_not_found_exception_if_no_selected_drink(): void { $this->expectException(NotFoundException::class);//期待する例外 $this->drinkRepository = new DrinkRepository(); $lastId = $this->drinkRepository->all()->last()->id; $this->drinkRepository->newDrink( new Drink($lastId+1, "テストドリンク", 100, 1, false)//テストデータ挿入 ); $user = new User(1, 'テストユーザー', 20, 100); (new DrinkService())->buy($user, $lastId+2); } /** * @testdox 所持金がドリンクの値段を下回っていた場合, NotEnoughMoneyExceptionをスロー * @throws NotEnoughMoneyException */ public function test_buy_should_throws_not_enough_money_exception_if_not_enough_money(): void { $this->expectException(NotEnoughMoneyException::class);//期待する例外 $this->drinkRepository = new DrinkRepository(); $lastId = $this->drinkRepository->all()->last()->id; $this->drinkRepository->newDrink( new Drink($lastId+1, "テストドリンク", 100, 1, false)//テストデータ挿入 ); $user = new User(1, 'テストユーザー', 20, 99); (new DrinkService())->buy($user, $lastId+1); } /** * @testdox 20歳未満のユーザーがアルコール飲料を購入しようとした場合, GuiltyExceptionをスロー * @throws GuiltyException */ public function test_buy_should_throws_guilty_exception_if_guilty_purchase(): void { $this->expectException(GuiltyException::class);//期待する例外 $this->drinkRepository = new DrinkRepository(); $lastId = $this->drinkRepository->all()->last()->id; $this->drinkRepository->newDrink( new Drink($lastId+1, "テストドリンク", 100, 1, true)//テストデータ挿入 ); $user = new User(1, 'テストユーザー', 19, 100); (new DrinkService())->buy($user, $lastId+1); } /** * @testdox どの例外もスルーされなかった場合, 正常に購入された結果をDrinkBoughtResultとして返す * @throws GuiltyException */ public function test_buy_correctly(): void { $this->drinkRepository = new DrinkRepository(); $lastId = $this->drinkRepository->all()->last()->id; $this->drinkRepository->newDrink( new Drink($lastId+1, "テストドリンク", 100, 2, true)//テストデータ挿入 ); $user = new User(1, 'テストユーザー', 20, 2000); $result = (new DrinkService())->buy($user, $lastId+1); $this->assertEquals($result->drink->stock, 1); $this->assertEquals($result->user->wallet, 1900); } /** * @testdox テストデータ削除 */ public function tearDown():void { $this->drinkRepository = new DrinkRepository(); $lastId = $this->drinkRepository->all()->last()->id; $this->drinkRepository->deleteDrink($lastId); } }

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

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

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

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

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

guest

回答2

0

自己解決

protected function setUp():void
{・・・}
のように返り値の型を追加してあげたら直りました。

投稿2021/06/08 15:07

donut4

総合スコア148

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

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

0

データベースのリセットしたいなら、

Illuminate\Foundation\Testing\RefreshDatabase トレイトを使えば良いので、なぜ、setUp() でやろうとしているのか謎です。

public function setUp(): void { parent::setUp(); // 必要 }

投稿2021/06/06 16:45

編集2021/06/06 16:51
phper.k

総合スコア3923

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

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

donut4

2021/06/06 18:23

いえ、DBをリセットをしたいのではなく、 $this->drinkRepository = new DrinkRepository(); $lastId = $this->drinkRepository->all()->last()->id; を外に出して各テストコードをすっきりさせたいのです。 今のソースだとtest_buy_should_throws・・・メソッドごとに 上記2行を書かなければいけないのでどうにかひとまとめにして、 各テストメソッドから一箇所を参照するようにさせたかったのですが可能でしょうか? (ソース管理修正しました)
phper.k

2021/06/07 01:31

__construct() 使えば?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問