与用户一起创建单元测试

时间:2018-03-06 02:35:17

标签: php laravel unit-testing

我想测试控制器的下一个方法

function index(){
        if(Auth::User()->can('view_roles'))
        {
            $roles = Role::all();
            return response()->json(['data' => $roles], 200);
        }

        return response()->json(['Not_authorized'], 401);
    }

它已经配置用于身份验证(tymondesigns / jwt-auth)和角色管理(spatie / laravel-permission),使用邮递员进行测试,我只是想以自动方式进行。

这是测试代码,如果我删除了TEST通过的控制器的条件函数,但是我想使用用户进行测试,但我不知道该怎么做。

public function testIndexRole()
{
    $this->json('GET', '/role')->seeJson([
        'name' => 'admin',
        'name' => 'secratary'
    ]);
}

1 个答案:

答案 0 :(得分:2)

取决于您正在构建的应用程序类型。

A - 将Laravel用于整个应用程序

如果你使用Laravel作为前端/后端,那么模拟登录用户就可以使用由Laravel团队制作的令人敬畏的Laravel Dusk包。您可以查看documentation here

这个软件包有一些有用的方法来模拟其他很多东西之间的登录会话,你可以使用:

$this->browse(function ($first, $second) {
    $first->loginAs(User::find(1))
          ->visit('/home');
});

这样您就可以使用已登录的id=1用户点击端点。还有很多东西。

B - 使用Laravel作为后端

现在,这主要是我如何使用Laravel。

要识别到达端点的用户,请求必须发送access_token。此令牌可帮助您的应用识别用户。因此,您需要对附加令牌的端点进行API调用。

我做了几个辅助函数,只需在每个Test类中重用它。我写了一个Utils特征,正在TestCase.php中使用,并且这个类被其他测试类扩展,它将随处可用。

1。创建辅助方法。

path / to / your / project / tests / Utils.php

Trait Utils {

/**
     * Make an API call as a User
     *
     * @param $user
     * @param $method
     * @param $uri
     * @param array $data
     * @param array $headers
     * @return TestResponse
     */
    protected function apiAs($user, $method, $uri, array $data = [], array $headers = []): TestResponse
    {
        $headers = array_merge([
            'Authorization' => 'Bearer ' . \JWTAuth::fromUser($user),
            'Accept'        => 'application/json'
        ], $headers);

        return $this->api($method, $uri, $data, $headers);
    }


    protected function api($method, $uri, array $data = [], array $headers = [])
    {
        return $this->json($method, $uri, $data, $headers);
    }
}

2。让它们可用。

然后在TestCase.php中使用特征:

路径/到/你/项目/测试/ TestCase.php

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication, Utils; // <-- note `Utils`

    // the rest of the code

3。使用它们。

现在您可以通过测试方法进行API调用:

/** 
* @test
* Test for: Role index
*/
public function a_test_for_role_index()
{
    /** Given a registered user */
    $user = factory(User::class)->create(['name' => 'John Doe']);

    /** When the user  makes the request */
    $response = $this->apiAs($user,'GET', '/role');

    /** Then he should see the data */
    $response
        ->assertStatus(200)
        ->assertJsonFragment(['name' => 'admin'])
        ->assertJsonFragment(['name' => 'secretary']);
}

旁注

检查测试方法之上是否有@test注释,这表明Laravel该方法是一个测试。您可以使用test_

为测试名称添加前缀或前缀