php - 使用 PHPUnit 进行流明测试,仅 2 次测试就显示了过多的断言
问题描述
我的测试工作正常,但是当我阅读这篇文章时,它提到了
每个测试方法一个断言
而且我认为我的测试做出了太多的断言,这是我的测试代码:
<?php
use Laravel\Lumen\Testing\DatabaseMigrations;
use Laravel\Lumen\Testing\DatabaseTransactions;
class GuestTest extends TestCase
{
use DatabaseTransactions;
/** @test */
public function guest_can_register()
{
$response = $this->json('POST', '/register', [
"name" => "Khrisna Gunanasurya",
"email" => "khrisnagunanasurya@gmail.com",
"password" => "adminadmin",
"password_confirmation" => "adminadmin"
]);
$response
->seeStatusCode(HttpStatus::$CREATED)
->seeJsonStructure([
"data" => [
"type",
"id",
"attributes" => [
'name',
'email'
]
]
]);
}
/** @test */
public function registered_guest_can_login()
{
$this->post('/register', [
"name" => "Khrisna Gunanasurya",
"email" => "khrisnagunanasurya@gmail.com",
"password" => "adminadmin",
"password_confirmation" => "adminadmin"
]);
$response = $this->json('POST', '/login', [
'email' => 'khrisnagunanasurya@gmail.com',
'password' => 'adminadmin'
]);
$response
->seeStatusCode(HttpStatus::$OK)
->seeJsonStructure([
'data' => [
'type',
'attributes' => [
'token',
'token_type',
'expires_in'
]
]
]);
}
}
所以我想问的是,对于那些简单的测试,我的测试是否返回了太多的断言?因为我意识到seeJsonStructure()
调用许多断言取决于嵌套数组结构,如果我的测试单元做出太多断言,将来有很多测试文件时会产生问题吗?
编辑
解决方案
如果你看一下 assertJsonStructure 的内容,你会看到这个函数是如何工作的,它基本上会遍历所有键并对响应进行断言。所以在这种情况下
public function assertJsonStructure(array $structure = null, $responseData = null){
foreach ($structure as $key => $value) {
if (is_array($value)) {
PHPUnit::assertArrayHasKey($key, $responseData);
$this->assertJsonStructure($structure[$key], $responseData[$key]);
} else {
PHPUnit::assertArrayHasKey($value, $responseData);
}
}
}
因此,您有 6 个断言由 assertJsonStructure 生成,另外一个由 seeStatusCode 生成。这将是总共 7 个断言,您有两个测试,它们的总和为 14。
推荐阅读
- pandas - Pandas 如何将多列 str% 替换为浮点数?
- java - 如何从 Java 中的 TrainValidationSplitModel 中提取最佳参数集?
- vuejs3 - VueJs 检测移动设备的方式,当我们需要渲染两个不同的视图时,相对于设备类型
- java - Java 是否使用具有非 void 返回类型的 setter 方法打破了自己的规则?
- angular - 如何更新路由上的主要角度组件?
- javascript - 数据表服务器端不允许重新初始化
- java - 窗口 10 让 tomcat 9 在 https 上工作
- python - sqlite3.OperationalError:“创建”附近:语法错误
- deep-learning - 标记所有可见对象以进行对象检测是否重要?
- teradata - Teradata 存储过程