如何使用没有路线的播种机测试Laravel?

时间:2019-08-13 13:53:52

标签: laravel tdd laravel-5.8

我有一个名为states的表,其中包含美国的全部50个州。它有两列nameabbr。播种机运转良好-一切都很好。

我正在尝试编写功能测试,以确保状态始终具有nameabbr。似乎有些矫kill过正,但我​​正在学习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,然后插入成功。

谢谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

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

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

    /**
     * @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(...)

写入了记录