* Решено * PHPUnit в Laravel возвращает 404 для простого запроса get, но отлично работает для других - PullRequest
0 голосов
/ 27 января 2020

В правильном рассоле с phpunit. В настоящее время у меня есть тестовый класс для маршрута с 9 тестами. Все эти тесты, кроме двух, проходят, по иронии судьбы, два самых простых; тесты для Articles.index и Articles.Show (последние 2 теста в коде ниже).

<?php

namespace Tests\Feature;

use App\Article;
use Tests\TestCase;
use App\User;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use DB;

class ArticleTest extends TestCase
{
    use RefreshDatabase;

    // runs before any of the tests
    protected function setUp(): void
    {
        parent::setUp();

        // run tests without language(locale) middleware
        $this->withoutMiddleware(\App\Http\Middleware\Language::class);
    }

    /** @test */
    public function unauthenticated_users_can_not_access_create()
    {
        $this->get('/articles/create')->assertRedirect('/login');
    }

    /** @test */
    public function admin_users_can_access_edit()
    {
        $article = factory(Article::class)->create();
        $record = DB::table('articles')->where('id', $article->id)->first();
        $user = factory(User::class)->create();
        $user->isAdmin = 1;
        $this->actingAs($user);
        $this->get('/articles/' . $record->slug . '/edit?locale=en')->assertOK();
    }

    /** @test */
    public function authenticated_but_not_admin_users_can_not_access_create()
    {
        $this->actingAs(factory(User::class)->create());
        $this->get('/articles/create')->assertRedirect('home');
    }

    /** @test */
    public function admin_can_access_create()
    {
        $user = factory(User::class)->create();
        $user->isAdmin = 1;
        $this->actingAs($user);
        $this->get('/articles/create')->assertOk();
    }

    /** @test */
    public function can_store_an_article()
    {
        $article = factory(Article::class)->create();
        $record = DB::table('articles')->where('id', $article->id)->first();
        $this->assertDatabaseHas('articles', ['slug' => $record->slug]);
    }

    /** @test */
    public function admin_can_access_articles_admin_index()
    {
        $user = factory(User::class)->create();
        $user->isAdmin = 1;
        $this->actingAs($user);
        $this->get('/admin/articles')->assertOk();
    }

    /** @test */
    public function admin_can_delete_article_and_it_is_removed_from_the_database()
    {
        $user = factory(User::class)->create();
        $user->isAdmin = 1;
        $this->actingAs($user);
        $article = factory(Article::class)->create();
        $this->assertDatabaseHas('articles', ['slug' => $article->slug]);
        $record = DB::table('articles')->where('id', $article->id)->delete();
        $this->assertDatabaseMissing('articles', ['slug' => $article->slug]);
    }

    /** @test */
    public function can_see_article_index_page()
    {
        $this->get('/articles')->assertOK();
    }

    /** @test */
    public function can_only_access_articles_made_visible()
    {
        $article = factory(Article::class)->create();
        $article->displayStatus = 2;
        $this->assertDatabaseHas('articles', ['slug' => $article->slug]);
        $this->get('/articles/' . $article->slug)->assertRedirect('/articles');
    }

}

Тест can_see_article_index_page должен возвращать код состояния 200, но это 404, а can_only_access_articles_made_visible должен быть кодом состояния перенаправления, а также 404.

SEEN HERE

Мое приложение многоязычное, использует пакет spatie / transhable, и я не уверен, что это мешает (на самом деле не имеет смысла, так как строка безMiddleware в setUp должна предотвращать это) или что-то еще целиком (т.е. моя глупость). Мое приложение построено с Laravel 5.8, и я использую phpunit 7.5.

РЕДАКТИРОВАТЬ Я обнаружил, что ошибка произошла из-за некоторых определенных c строк, которых нет в моей тестовой базе данных, где в моем контроллере он потерпит неудачу, если не сможет их найти. Добавив строку $this->withoutExceptionHandling() к ошибочным тестам, он сообщил мне эту информацию.

1 Ответ

0 голосов
/ 27 января 2020

Поскольку все ваши маршруты работают, но /articles, это означает, что что-то не так с вашими маршрутами.

Вы добавили этот маршрут в последнее время: каждый раз, когда вы создаете новый маршрут или вносите какие-либо изменения в файлы маршрута laravel, вы должны выполнить команду php artisan config:cache.

Я почти уверен, что это не конфликт в маршрутах из-за переменной {}, поскольку код состояния - это чистый код 404, означающий, что к контроллеру даже нет доступа, поэтому я не буду более подробно останавливаться на возможных конфликтующих проблемах маршрутизации.

Если ошибка не исчезнет, ​​хотя получите ваш маршрут в самом верху вашего файла маршрутов и посмотрите, работает ли он там. Если это так, то это означает, что один из ваших маршрутов перекрывает его.

Быстрое решение этой проблемы - заказать ваши stati c названия маршрутов над маршрутами, используя переменные, например:

/articles
/{articles}

Если вы измените указанную выше последовательность, ваш маршрут /articles никогда не будет доступен. Это случай именования конфликтов маршрутов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...