Как я могу правильно получать ошибки в модульном тестировании laravel, а также отключать проверки csrf?

#unit-testing #laravel-5 #phpunit

#модульное тестирование #laravel-5 #phpunit

Вопрос:

Я пытаюсь протестировать свой post метод в контроллере. Определение метода выглядит примерно так :

     public function store(Request $request)
    {
        $article = new Article;

        $article->id = $request->input('article_id');
        $article->title = $request->input('title');
        $article->body = $request->input('body');
        return response(["success"], 200);
    }
  

Я создал тест, который просто сохраняет данные и проверяет, равен ли ответ 200.
Пожалуйста, также покажите мне, как я могу улучшить этот тест для новичков в тестировании. Но я получаю 404 error Я не знаю, в чем ошибка. Как я могу отобразить ошибки, какие настройки мне нужно настроить?
Тест:

 public function test_post_new_article(){
        $article = factory(Article::class)->make();
        $this->call('POST', 'article', [
            '_token' => csrf_token(),
            'article_id' => 6,
            'title'=>"hey",
            'body' => "this is a body"
        ])->assertStatus(200);
    }
  

ошибка phpunit:

 There was 1 failure:

1) TestsUnitExampleTest::test_post_new_article
Expected status code 200 but received 404.
Failed asserting that false is true.
  

Ответ №1:

Я предполагаю, что вы определили маршрут в routes/api.php таким образом, чтобы префикс вашего конкретного маршрута был /api/ .

Вы должны вызвать полный путь к маршруту API:

     $this->call('POST', '/api/article', [
        '_token' => csrf_token(),
        'article_id' => 6,
        'title'=>"hey",
        'body' => "this is a body"
    ])->assertStatus(200);
  

Кроме того, поскольку CSRF должен быть реализован на вашем уровне промежуточного программного обеспечения, а добавлять _token ко всем вашим тестовым запросам утомительно и глупо, вам, вероятно, следует просто отключить промежуточное программное обеспечение в ваших тестах:

 use IlluminateFoundationTestingWithoutMiddleware;

class MyControllerTest {
    use WithoutMiddleware;

    ... public function testmyUnitTest() { ... }
}
  

Комментарии:

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

2. @ReyYoung Если вы замените свою $this->call строку на ту, которую я предоставил, это должно исправить вашу ошибку 404.