romegasoftware / nova-test-suite
库,帮助更快地进行 Laravel Nova 资源测试
Requires
- php: ^7.3|^8.0.2
- ext-json: *
- illuminate/contracts: ^8.0|^9.0
- illuminate/filesystem: ^8.0|^9.0
- illuminate/support: ^8.0|^9.0
- illuminate/testing: ^8.0|^9.0
Requires (Dev)
- dms/phpunit-arraysubset-asserts: ^0.2.1
- orchestra/testbench: ^v6.0
README
安装
composer require romegasoftware/nova-test-suite --dev
用法
生成资源测试用例
要开始,运行 php artisan nova:test resource_name
。这将为资源生成测试用例,如果尚未发布,则发布 NovaResourceTestCase
。
创建资源测试后的第一件事是填充 remapResource()
方法。此方法必须将 Nova 字段名称映射到资源属性。不需要映射资源的每个属性,只需映射更改的或需要不同的属性即可。
protected function remapResource($resource): array { return [ 'location' => $resource->location_id, 'theme' => $resource->theme_id, ]; }
$resource
参数是通过 factory()
生成的新模型实例,因此应包含您需要的任何必要值。如果调用带有任何数据的 Nova 请求方法(如 $this->storeResource(['name' => 'test'])
),则 $data
参数将填充。
请求
获取资源
// retrieve all available resources = viewing the index page $this->getResources(); // retrieve a single resource = viewing a single resource in detail view $resource = Resource::factory()->create(); $this->getResources($resource);
存储资源
// resource data is generated behind the scenes with factory()->make() $this->storeResource(); // also accepts model classes or arrays $resource = Resource::factory()->make(); $this->storeResource($resource); $this->storeResource(['name' => 'Vader']);
如果资源存储成功,则响应的返回状态码为 201
。
更新资源
// resource data is generated behind the scenes with factory()->create() $this->updateResource(['name' => 'Vader']); // accepts model classes $resource = Resource::factory()->create(); $resource->name = 'Vader'; $this->updateResource($resource);
删除资源
// resource data is generated behind the scenes with factory()->create() $this->deleteResource(); // also accepts model classes, arrays or integers (ids) $resource = Resource::factory()->create(); $this->deleteResource($resource); $this->deleteResource(['id' => 12]); $this->deleteResource(12);
关系
$this->assertHasManyRelationships([ 'product', ]); $this->assertBelongsToRelationships([ 'user', ]);
assertHasOneRelationships(array)
assertHasManyRelationships(array)
assertBelongsToRelationships(array)
assertBelongsToManyRelationships(array)
assertMorphToRelationships(array)
assertMorphOneRelationships(array)
assertMorphManyRelationships(array)
操作
使用 assertHasActions()
透镜
使用 assertHasLenses()
过滤器
使用 assertHasFilters()
断言请求失败
由于失败的 nova 请求返回带有状态码 301
的重定向,我们引入了新的方法 assertNovaFailed()
,它检查这一点,而无需考虑失败的 nova 响应返回的状态码。
$this->storeResource() ->assertNovaFailed();
测试必填字段
要测试您的 Nova 资源是否设置正确,并检查是否所有必填字段都按预期设置,您可以使用 setNullValuesOn([..])
方法,该方法将您输入的每个键的下一个请求的值都设置为 null
。
$this->setNullValuesOn(['customer', 'number_of_participants']) ->storeResource() ->assertRequiredFields(['customer', 'number_of_participants']);
使用默认用户
默认情况下,每个 nova 请求方法都会检查请求是否通过 actingAs($user, 'api')
已通过身份验证。如果没有提供用户进行身份验证,我们将使用 getDefaultUser()
方法来身份验证您的请求。如果您想明确使用请求的默认用户,可以使用 $this->beDefaultUser()
,这将返回当前类,因此它也可以用于链式操作,例如 $this->beDefaultUser()->storeResource()
。
如果您想为每个请求使用自己的用户,可以重写 getDefaultUser()
方法。
protected function getDefaultUser() { return $this->yourOwnUser; }
调试失败的请求
为了更容易地调试为什么您的 nova 请求失败,您可以在进行任何断言之前链式调用 assertSessionDoesntHaveErrors()
。此方法将转储所有会话错误和请求的 JSON 响应。
$this->storeResource() ->assertSessionDoesntHaveErrors();
如果您仍然无法找出为什么您收到了响应的状态码,请尝试使用 withoutNovaExceptionHandling()
来找出响应背后的原因。此方法调用将创建一个回调,该回调在 Nova 中间件运行时立即调用 withoutExceptionHandling()
。您也可以链式调用这些调用。
$this->withoutNovaExceptionHandling() ->storeResource();
测试
使用以下命令运行测试
vendor/bin/phpunit
更改日志
请参阅变更日志以获取更多关于最近变更的信息。
贡献
请参阅贡献指南以获取详细信息。
致谢
安全
如果您发现任何安全相关的问题,请通过电子邮件bkeith@romegasoftware.com联系,而不是使用问题跟踪器。
许可证
MIT许可证(MIT)。请参阅许可证文件以获取更多信息。