我如何用 Table 没有路由的播种机测试 Laravel?
How Can I Test Laravel With Table Seeders That Do Not Have A Route?
我有一个名为 states
的 table,包含美国所有 50 个州。它有两列,name
和 abbr
。播种机工作得很好——一切都很好。
我正在尝试编写功能测试以确保状态始终具有 name
和 abbr
。似乎有点矫枉过正,但我正在学习 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(...)
写入了一条记录
我有一个名为 states
的 table,包含美国所有 50 个州。它有两列,name
和 abbr
。播种机工作得很好——一切都很好。
我正在尝试编写功能测试以确保状态始终具有 name
和 abbr
。似乎有点矫枉过正,但我正在学习 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(...)