为什么我在laravel中运行测试时收到“CSRF令牌不匹配”?

r8xiu3jd  于 2022-12-05  发布在  其他
关注(0)|答案(5)|浏览(144)

我希望在运行测试时不会收到“CSRF令牌不匹配”异常。
运行测试时,CSRF中间件将自动禁用。
抛出异常的代码行如下所示:

$response = $this->json('POST', route('order.create'), [
     'product_id', $product->id
]);

为了运行测试,我在我的zsh终端中工作:

php artisan test --env=testing

这是我的测试类:

<?php

   namespace Tests\Feature;

   use Illuminate\Foundation\Testing\RefreshDatabase;
   use Illuminate\Foundation\Testing\WithFaker;
   use Illuminate\Foundation\Testing\WithoutMiddleware;
   use Tests\TestCase;

  class SessionCartTest extends TestCase
  {
      public function testExample()
      {
          $product = \App\Product::inRandomOrder()->first();
          $response = $this->postJson(route('order.insert'), [
              'product_id' => $product->id,
          ]);
          $response->assertStatus(200); // here I receive 419
      }
  }

我做错了什么,我怎么能解决这个问题?我正在使用laravel 7。

ioekq8ef

ioekq8ef1#

我现在遇到这个问题x次,每次我都通过运行以下命令来修复它:php artisan config:clear

efzxgjgh

efzxgjgh2#

可能是APP_ENV未设置为testing
您可以通过在php命令之前在命令行中设置ENV变量。
因此,在您的情况下,将环境设置为测试,并通过以下方式运行artisan命令:

APP_ENV=testing php artisan test
ujv3wf0j

ujv3wf0j3#

您的数据数组错误。请尝试下列变更:

$response = $this->postJson(route('order.insert'), [
      'product_id' => $product->id, // use the arrow notation here.
 ]);
pbossiut

pbossiut4#

当你在Docker上运行测试时,如果APP_ENV被硬编码为docker-composite.yaml文件中的testing(dev,local)以外的值,phpunit将无法正常执行测试。你需要删除Docker文件中的所有APP_ENV。

os8fio9y

os8fio9y5#

这是通过设置自定义csrf-token来实现的

$this
   ->withSession(['_token' => 'bzz'])
   ->postJson('/url', ['_token' => 'bzz', 'other' => 'data']);

相关问题