我想测试控制器的下一个方法
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'
]);
}
答案 0 :(得分:2)
取决于您正在构建的应用程序类型。
如果你使用Laravel作为前端/后端,那么模拟登录用户就可以使用由Laravel团队制作的令人敬畏的Laravel Dusk包。您可以查看documentation here。
这个软件包有一些有用的方法来模拟其他很多东西之间的登录会话,你可以使用:
$this->browse(function ($first, $second) {
$first->loginAs(User::find(1))
->visit('/home');
});
这样您就可以使用已登录的id=1
用户点击端点。还有很多东西。
现在,这主要是我如何使用Laravel。
要识别到达端点的用户,请求必须发送access_token
。此令牌可帮助您的应用识别用户。因此,您需要对附加令牌的端点进行API调用。
我做了几个辅助函数,只需在每个Test类中重用它。我写了一个Utils
特征,正在TestCase.php
中使用,并且这个类被其他测试类扩展,它将随处可用。
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);
}
}
然后在TestCase.php
中使用特征:
路径/到/你/项目/测试/ TestCase.php
abstract class TestCase extends BaseTestCase
{
use CreatesApplication, Utils; // <-- note `Utils`
// the rest of the code
现在您可以通过测试方法进行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_