laravel - 如何使用没有路由的 Table Seeders 测试 Laravel?
问题描述
我有一张名为的表格states
,其中包含美国所有 50 个州。它有两列,name
和abbr
。播种机工作得很好——一切都很好。
我正在尝试编写功能测试以确保状态始终具有name
and 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
,然后一个成功插入。
感谢您的任何建议!
解决方案
您的数据库不允许您的应用程序处于无效状态,因此您无法测试您的应用程序在该状态下的行为。但是,您可以测试数据库不允许您进入该状态。
在这种情况下,我会说运行工厂并测试它是否会引发您期望的异常是一个很好的测试。
/**
* @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');
}
您可以对a_state_must_have_an_abbr
. 此外,您可以进行实际上确实成功写入记录的测试$this->assertDatabaseHas(...)
推荐阅读
- php - 从数字中删除整数数组值
- vue.js - 每次导航发生时都会执行 nuxtServerInit
- python - 使用关键字参数模拟方法
- jquery - 使用路线服务时,我在属性“目的地”中收到 InvalidValueError
- r - ggplot 返回一个堆叠的条形图而不是一个单独的条形图
- codeigniter - 如何在codeigniter 4中自动加载自制的配置文件?
- javascript - ExtJS:从 Ajax 发布请求响应中获取文件
- android - MediaRecorder.start() 有时会抛出 java.lang.RuntimeException: start failed
- sql - 如何使用行值 sqlite 更新列
- angularjs - Angular 混合应用程序 - Angular 2 路由器不工作