Как я могу исправить ошибку csrf при выполнении http-тестов? - PullRequest
0 голосов
/ 24 сентября 2018

В моем приложении laravel 5.7.3 я делаю автоматические тесты, как написано здесь https://laravel.com/docs/5.7/http-tests

Я создаю нового пользователя и открываю профиль под этим новым пользователем и пытаюсь изменить некоторые поля, которые можно редактировать на этой странице.,Я получил ошибку при внесении изменений:

"
Illuminate\Session\TokenMismatchException {#621
  #message: ""
  #code: 0
  #file: "./vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php"
  #line: 82
  trace: {
    ./vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:82 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:223 { …}
    ...
    ./tests/Feature/ProfilepageTest.php:87 {
      › $response                     = $this->actingAs($newUser)->get('/profile/edit-details');
      › $response = $this->put( 'profile/edit-details-put', [ 'first_name' => 'Modified : '.$newUser->first_name, 'last_name' => 'Modified : '.$newUser->last_name, 'phone'=>'Modified : '.$newUser->phone, 'website'=>'Modified : '.$newUser->website, 'csrf_token'=> $csrf_token  ]);
      › 
      arguments: {
        $uri: "profile/edit-details-put"
        $data: array:5 [ …5]
      }
    }
    ./vendor/phpunit/phpunit/src/Framework/TestCase.php:1150 { …}

Эта ошибка вызвана моим кодом:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use DB;
use Illuminate\Foundation\Testing\WithFaker;

class ProfilePageTest extends TestCase  // vendor/bin/phpunit   tests/Feature/ProfilepageTest.php
{
    public function testProfilePage()
    {


        $csrf_token = csrf_token();
        ...
        $newUser                    = new User();
        $newUser->username          = 'Testing user on '.now();
        $newUser->email             = 'Testing_user_on_'.now().'@site.com';
        ...
        $newUser->save();
        $testing_user_id            = $newUser->id;
        ...


        $response                     = $this->actingAs($newUser)->get('/profile/edit-details');
        $response = $this->put( 'profile/edit-details-put', [ 'first_name' => 'Modified : '.$newUser->first_name, 'last_name' => 'Modified : '.$newUser->last_name, 'phone'=>'Modified : '.$newUser->phone, 'website'=>'Modified : '.$newUser->website, 'csrf_token'=> $csrf_token  ]);
        ...


    }
}

В моем маршруте / web.php:

Route::group(array('prefix' => 'profile', 'middleware' => ['auth', 'isVerified']), function(){
    Route::put('edit-details-put', array(
        'as'      => 'profile-edit-details-put',
        'uses'    => 'ProfileController@update_details'
    ));

Iиспользуйте Auth bad jrean / laravel-user-validating для проверки этого URL.и в документах по http-тестам я нашел следующее:

The CSRF middleware is automatically disabled when running tests.

Но все равно я получил ошибку csrf.

Почему и как это исправить?

Спасибо!

...