首页 > 解决方案 > 如何使用没有路由的 Table Seeders 测试 Laravel?

问题描述

我有一张名为的表格states,其中包含美国所有 50 个州。它有两列,nameabbr。播种机工作得很好——一切都很好。

我正在尝试编写功能测试以确保状态始终具有nameand abbr。似乎有点矫枉过正,但我​​正在学习 TDD,似乎是另一个学习的地方。

因为永远只有 50 个状态,所以我没有控制器或路由来创建新状态。我只是调用播种机来填充表格。

我的测试如下所示:

namespace Tests\Feature;

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

use App\State;

class StatesTest extends TestCase
{
    use WithFaker, RefreshDatabase;

    /**
     * @test
     */
    public function a_state_must_have_a_name(): void
    {
        // Persist a new state.
        $state = factory(State::class)->create([
            'name' => null,
        ]);

        // Verify that name is missing.
        $this->assertDatabaseMissing('name');  // wrong but kind of what I'm looking for
    }
}

我得到的错误是:

Integrity constraint violation: 1048 Column 'name' cannot be null

这是绝对正确的。只是不确定如何编写测试以使其通过。我想要另外两个,一个检查否abbr,然后一个成功插入。

感谢您的任何建议!

标签: laraveltddlaravel-5.8

解决方案


您的数据库不允许您的应用程序处于无效状态,因此您无法测试您的应用程序在该状态下的行为。但是,您可以测试数据库不允许您进入该状态。

在这种情况下,我会说运行工厂并测试它是否会引发您期望的异常是一个很好的测试。

    /**
     * @test
     */
    public function a_state_must_have_a_name(): void
    {
        // Persist a new state.
        $state = factory(State::class)->create([
            'name' => null,
        ]);

        // Verify that name is missing.
        $this->expectException(\Exception::class);
        $this->expectExceptionMessage('Integrity constraint violation: 1048 Column 'name' cannot be null');
    }

有关更多信息,请参阅 phpunit 文档

您可以对a_state_must_have_an_abbr. 此外,您可以进行实际上确实成功写入记录的测试$this->assertDatabaseHas(...)


推荐阅读