我有一个名为states
的表,其中包含美国的全部50个州。它有两列name
和abbr
。播种机运转良好-一切都很好。
我正在尝试编写功能测试,以确保状态始终具有name
和abbr
。似乎有些矫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
,然后插入成功。
谢谢您的任何建议!
答案 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(...)