我如何用 Table 没有路由的播种机测试 Laravel?

How Can I Test Laravel With Table Seeders That Do Not Have A Route?

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

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

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

我的测试是这样的:

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 然后是一个成功的插入。

感谢您的任何建议!

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

在这种情况下,我认为这将是对 运行 工厂的一个很好的测试,并测试它是否抛出您期望的异常。

    /**
     * @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');
    }

See phpunit docs for more info.

您可以对 a_state_must_have_an_abbr 执行相同的操作。此外,您可以进行一项测试,该测试实际上确实成功地使用 $this->assertDatabaseHas(...)

写入了一条记录