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 协议》,转载必须注明作者和本文链接
讨论数量: 2

@Wi1dcard 孙哥 还能更优化一些吗

5年前 评论

@郝合心 可以,没有大问题,比较简单的集成测试。

有两点需要提醒一下:

  • User::find(7) 以及最后的 'user_id' => 7,这个 ID 是依赖于数据库的,首先一定要保证这条记录存在,可以了解一下「数据填充」其次尽量不要 多处 硬编码。可以封装为 Trait 或是 Private method 等;没有特殊要求的话,不取特定用户也可以,可以拿某个表内随机一个用户,配合数据填充可以尽可能地模拟真实情况。

  • 因为还没有单元测试,在创建、更新用户等测试用例中,也可在进行测试之后不仅仅验证返回的状态码、响应,还执行一些白盒断言,比如断言数据库存在某条记录,某个字段值是什么。
5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!