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

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

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

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

Q&A

解決済

1回答

1163閲覧

Laravel8 レコード追加件数確認テストの方法

yuuu752

総合スコア18

Laravel

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

0グッド

0クリップ

投稿2021/06/12 09:22

前提・実現したいこと

Laravel8のFeatureでレコード追加件数確認のテストを通したい。

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

StockTest.phpの//レコード件数確認下にテストを実装し、テストを実行すると下記エラーが発生します。
(エラーで指摘された94行目のコードはコメントアウトにて記載)
お手数ですが、テストの記述等に怪しい点があればご指摘、アドバイスお願い致します。

root@75d06dc082fc:/work# vendor/bin/phpunit tests/Feature/StockTest.php PHPUnit 9.5.4 by Sebastian Bergmann and contributors. ........E 9 / 9 (100%) Time: 00:02.951, Memory: 32.00 MB There was 1 error: 1) Tests\Feature\StockTest::testInsertFactoryTest Error: Call to undefined function Tests\Feature\factory() /work/tests/Feature/StockTest.php:94 ERRORS! Tests: 9, Assertions: 17, Errors: 1.

該当のソースコード

StockTest.php

<?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; use App\Models\Stock; use App\Models\User; class StockTest extends TestCase { /** * A basic feature test example. * * @return void */ use RefreshDatabase; public function test_login_screen_can_be_rendered() { $response = $this->get('/login'); $response->assertStatus(200); } public function test_list_screen_can_be_rendered() { $response = $this->get('/list'); $response->assertStatus(302); } public function test_Can_Login(): void { $user = User::factory(User::class)->create([ 'password' => bcrypt('password'), ]); $response = $this->from('/login')->post('/login', [ 'email' => $user->email, 'password' => 'password', ]); $response->assertRedirect('/list'); $this->assertAuthenticatedAs($user); } public function test_add_screen_can_be_rendered() { $response = $this->get('/list/add'); $response->assertStatus(302); $response = $this->post('/list/addCheck'); $response->assertStatus(302); $response = $this->post('/list/addDone'); $response->assertStatus(302); } public function test_show_screen_can_be_rendered() { $response = $this->get('/list/show/{id}'); $response->assertStatus(302); } public function test_edit_screen_can_be_rendered() { $response = $this->get('/list/edit/{id}'); $response->assertStatus(302); $response = $this->post('/list/editCheck/{id}'); $response->assertStatus(302); $response = $this->post('/list/editDone/{id}'); $response->assertStatus(302); } public function test_del_screen_can_be_rendered() { $response = $this->get('/list/delCheck/{id}'); $response->assertStatus(302); $response = $this->post('/list/delDone/{id}'); $response->assertStatus(302); } public function test_search_screen_can_be_rendered() { $response = $this->post('/list/search'); $response->assertStatus(302); } //レコード件数確認 public function testInsertFactoryTest() { $stocks = Stock::factory(Stock::class, 3)->create(); //94行目エラーで指摘 $count = count($stocks); $this->assertEquals(3, $count); } }

app/Models/Stock.php

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Stock extends Model { use HasFactory; protected $fillable = ['shop','purchase_date','deadline','name','price','number']; }

database/factories/StockFactory.php

<?php namespace Database\Factories; use App\Models\Stock; use Illuminate\Database\Eloquent\Factories\Factory; class StockFactory extends Factory { protected $model = Stock::class; public function definition() { return [ 'shop' => $this->faker->word, 'purchase_date' => $this->faker->dateTimeBetween('-20 days', now()), 'deadline' => $this->faker->dateTimeBetween(now(), '+1 week'), 'name' => $this->faker->word, 'price' => $this->faker->numberBetween(10,100), 'number' => $this->faker->numberBetween(10,100) ]; } }

試したこと

・テストの記述を変更し、再度テスト実行

public function testInsertFactoryTest(): void { $stocks = Stock::factory(Stock::class, 3)->create([ //'shop' => 'ドンキ', //'purchase_date' => '2020-09-12', //'deadline' => '2020-10-12', //'name' => 'ティッシュ', //'price' => '200', //'number' => '2' ]); $count = count($stocks); $this->assertEquals(3, $count); }
public function testInsertFactoryTest(): void { $stocks = Stock::factory(Stock::class, 3)->create([ 'shop' => $this->faker->word, 'purchase_date' => $this->faker->dateTimeBetween('-20 days', now()), 'deadline' => $this->faker->dateTimeBetween(now(), '+1 week'), 'name' => $this->faker->word, 'price' => $this->faker->numberBetween(10,100), 'number' => $this->faker->numberBetween(10,100) ]); $count = count($stocks); $this->assertEquals(3, $count); }

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

m.ts10806

2021/06/12 09:48

エラー自体は理解されてるのでしょうか。 「やりたいこと」以前の問題では?
yuuu752

2021/06/12 10:30

コメントありがとうございます。 未定義のfactory()関数を呼び出しているということは理解しています。
phper.k

2021/06/12 12:07

Laravel8 を使っていながら、中途半端に7以前のようなコード書いているのが原因なので、Laravel8 のリファレンスだけを読んで書いてください。
yuuu752

2021/06/12 12:10

アドバイス頂きありがとうございます。 先ずはLaravel8のリファレンスを読んでみます。
yuuu752

2021/06/12 12:48

phper.kさんありがとうございました。 laravel8での書き方に変更したことでテストが通りました。 変更点につきましては、下記の解決方法に記載させて頂きます。
guest

回答1

0

自己解決

テストの記述を以下の通り(Laravel8の書き方)に変更したことで解決しました。

public function testInsertFactoryTest() {                 //$stocks = Stock::factory(Stock::class, 3)->create();                     ↓     $stocks =Stock::factory(Stock::class)->count(3)->create(); $count = count($stocks); $this->assertEquals(3, $count); }

投稿2021/06/12 12:49

yuuu752

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問