いつもお世話になってなっております。
Laravel で投稿機能のテストコードを書いてるのですが、
Error: Call to a member function getStatusCode() on null
のエラーが出てしまったので皆様のお知恵をお借りしたいです。
#バージョン
PHP 7.3.26
Laravel Framework 6.20.16
#実装したいこと
Laravel で CRUD を実装したので、投稿機能のフィーチャーテストを行いたい。
参考
Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (9) 写真投稿API
Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (14) コメント投稿機能
Laravelでテストコードを書くには? Featureテスト/Unitテスト
#現状のコード
php
1class ArticlePostApiTest extends TestCase 2{ 3 use RefreshDatabase; 4 5 public function setUp(): void 6 { 7 parent::setUp(); 8 $this->user = factory(User::class)->create(); 9 } 10 11 public function test_投稿() 12 { 13 14 factory(Article::class)->create(); 15 $user_id = factory(Article::class)->create()->id; 16 $article = Article::first(); 17 18 $response = $this->postJson('article.store', [ 19 'user_id' => $user_id, 20 'id' => $article->id, 21 'title' => $article->title, 22 'content' => $article->content, 23 ]); 24 25 $response->assertStatus(201); 26 } 27 28}
#試したこと、確認できていること
① dd() でポスト内容を確認
dd を使って $user_id, $article->id, $article->title, $article->content の中身は想定した値になっています。よって factory でダミーの投稿データとユーザーデータは作成されてると思います。
② dd($response) でレスポンスを確認
エラー内容的に、「$response の中身が空のため、メソッドが実行できない」と解釈したため、実行したところ以下のように表示されます。
php
1Illuminate\Foundation\Testing\TestResponse^ {#104 2 +baseResponse: null 3 #streamedContent: null 4}
③ ルーティングを変更
$this->postJson('article.store'
こちらのコードを以下に変更(Name から URIへ)
$this->postJson('/api/article/'
###結果
エラー文が以下に変わる
Expected status code 201 but received 403.
dd() で出力すると
Trying to get property 'id' of non-object"
と出ます。
しかし上述したように id, user_id 共に値は確認できています、
php artisan route:list でルーティングで確認したところ、どちらもルートは同じものを指してることが確認できているのでここでなぜ違うエラーが出るのかも正直よくわかっていません、、
テストコードの実装が初めてのため、確認不足、知識不足な点はあると思いますが、一度皆様のお知恵をお借りできればと思います。よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/28 23:00