Laravel+dingoApi 接口集成测试
借助一个模型的 增删改查接口 来实现 接口的集成测试
- 覆盖到了这个模型涉及的 增删改查 接口
- 利用 DatabaseTransactions 类 实现了数据库回滚 保证数据库的清洁
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\User;
use App\Models\UserAddress;
use Tests\Traits\ActingJWTUser;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class UserAddressTest extends TestCase {
use ActingJWTUser;
use DatabaseTransactions;
/** @test */
public function user_address_index()
{
$response = $this->JWTActingAs(User::find(7))
->json('GET', '/api/userAddresses?include=provinceinfo,cityinfo,areainfo');
$response->assertStatus(200)
->assertJsonStructure(['data', 'meta']);
}
/** @test */
public function add_a_user_address()
{
$response_add = $this->JWTActingAs(User::find(7))
->json('POST', '/api/userAddresses', [
'consignee_name' => '测试',
'consignee_phone' => '18352506063',
'consignee_address' => '东吴北路',
'province' => 11,
'city' => 94,
'area' => 941,
'default_status' => 1,
]);
$response_add->assertStatus(200)->assertJsonFragment([
'consignee_name' => '测试',
'consignee_phone' => '18352506063',
'consignee_address' => '东吴北路',
'province' => 11,
'city' => 94,
'area' => 941,
]);
}
/** @test */
public function show_a_user_address()
{
$user_address = $this->makeUserAddress();
$response = $this->JWTActingAs(User::find(7))
->json('GET', '/api/userAddresses/' . $user_address->id . '?include=provinceinfo,cityinfo,areainfo');
$response->assertStatus(200);
}
/** @test */
public function edit_a_user_address()
{
$user_address = $this->makeUserAddress();
$response = $this->JWTActingAs(User::find(7))
->json('PUT', '/api/userAddresses/' . $user_address->id, [
'consignee_name' => '测试',
'consignee_phone' => '18352506063',
'consignee_address' => '东吴北路',
'province' => 11,
'city' => 94,
'area' => 941,
'default_status' => 1,
]);
$response->assertStatus(200)->assertJsonFragment([
'consignee_name' => '测试',
'consignee_phone' => '18352506063',
'consignee_address' => '东吴北路',
'province' => 11,
'city' => 94,
'area' => 941,
'default_status' => 1,
]);
}
/** @test */
public function delete_a_user_address()
{
$user_address = $this->makeUserAddress();
$response = $this->JWTActingAs(User::find(7))
->json('DELETE', '/api/userAddresses/' . $user_address->id);
$response->assertStatus(204);
$response = $this->JWTActingAs(User::find(7))
->json('GET', '/api/userAddresses/' . $user_address->id . '?include=provinceinfo,cityinfo,areainfo');
$response->assertStatus(404);
}
private function makeUserAddress()
{
return factory(UserAddress::class)->create([
'user_id' => 7,
'company_id' => 49,
]);
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
@Wi1dcard 孙哥 还能更优化一些吗
@郝合心 可以,没有大问题,比较简单的集成测试。
有两点需要提醒一下:
User::find(7)
以及最后的'user_id' => 7
,这个 ID 是依赖于数据库的,首先一定要保证这条记录存在,可以了解一下「数据填充」其次尽量不要 多处 硬编码。可以封装为 Trait 或是 Private method 等;没有特殊要求的话,不取特定用户也可以,可以拿某个表内随机一个用户,配合数据填充可以尽可能地模拟真实情况。