В правильном рассоле с 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()
к ошибочным тестам, он сообщил мне эту информацию.