Laravel单元测试

单元测试

默认情况下,tests 目录包含了两个子目录:Feature 和 Unit,分别用于功能测试和单元测试,单元测试专注于小的、相互隔离的代码,实际上,大部分单元测试可能都是聚焦于单个方法。功能测试可用于测试较大区块的代码,包括若干组件之前的交互,甚至一个完整的HTTP请求。

创建一个新的测试

//Feature
php artisan make:test UserTest
//Unit
php artisan make:test UserTest --unit

运行测试

phpunit
.vendor/bin/phpunit
.vendor/bin/phpunit --filter=ExampleTest

setup方法

setUp 方法会在测试开始之前执行。类似我们的构造函数。

public function setUp(): void
    {
        parent::setUp(); // TODO: Change the autogenerated stub
        $this->tenantUser = User::query()->find(2);
        $this->schoolUser = User::query()->find(3);
    }

这其中我们使用了一个名为 ActingJWTUser 的 trait , 这个 trait 的主要作用是帮我们获取我们刚刚 查询出来的测试用户的 Token , 并且在我们对接口进行测试的时候可以设置 Bearer Token 。

这样我们就能方便的使用 JWTActingAs 方法,登录查询的指定用户。最后得到的响应 $response,通过 assertStatus 断言响应结果为 200。

public function JWTActingAs(User $user)
    {
        $token = $user->createToken($user->name . '-Token')->accessToken;
        $this->withHeaders(['Authorization' => 'Bearer '.$token]);
        $this->withHeaders(['OrganizationId' => 4]);

        return $this;
    }
public function index_tenant_role(){
        //查看租户角色
        $response = $this->JWTActingAs($this->tenantUser)->json('GET','/api/tenantRole');
        $response->assertStatus(200);
    }

注意点

要想获取到Auth::user(),即当前登录用户的相关信息,需要伪造认证用户。

//伪造认证用户
$this->be($this->user,'api');
/**
 * 创建租户角色并关联所有权限
*/
 protected function makeRole(){
      $role = factory(Role::class)->create();

      //关联所有权限
      $role->givePermissionTo(Permission::all();
      return $role;
}
/** @test*/
    public function delete_tenant_role(){
        //删除租户角色
        $role = $this->makeRole();

        $response = $this->JWTActingAs($this->tenantUser)->json('DELETE','/api/tenantRole/'.$role->id);

        $response->assertStatus(200);

        $response = $this->JWTActingAs($this->tenantUser)->json('GET','/api/tenantRole/'.$role->id);

        $response->assertStatus(404); //已删除
    }

Unit测试

关联测试

/** @test */
    public function a_user_has_tenant(){
        //用户所属租户
        $this->assertInstanceOf(Tenant::class,$this->user->tenant);
    }

    /** @test */
    public function a_user_has_organizations(){
        //用户所属机构
        $this->assertInstanceOf('Illuminate\Database\Eloquent\Collection',$this->user->organizations);
    }

你可能感兴趣的:(laravel)