具有依赖注入的JWT和单元测试

时间:2018-01-27 14:00:30

标签: php laravel unit-testing dependency-injection

我是OOP PHP世界的新手,所以如果我做错了,请随时纠正我。

为了使用JWT(JSON Web Token)函数,我需要在构造函数中实例化它,而使用test_registration_input_validation我尝试为RegisterController中的方法编写单元测试,但我无法访问它们,因为我可以' t实例化RegisterController。构造函数有一个输入参数,JWTAuth有自己的输入参数,所以它是一个无限循环。有什么想法吗?

class RegisterController extends Controller{

public $jwtauth;


public function __construct(JWTAuth $jwtauth){ 

    $this->jwtauth = $jwtauth;

}


 public function test_registration_input_validation(){

    $register = new RegisterController(new JWTAuth());

1 个答案:

答案 0 :(得分:1)

如果您正在为控制器编写单元测试,那么您应该模拟您的依赖项,而不是传递它们的实例,以便您可以隔离该组件。 Mockery开箱即用Laravel,非常适合这个用例。

我注意到你已经使用依赖注入来插入JWTAuth,这将使这更容易。您可以按如下方式创建JWTAuth的模拟:

$jwt = Mockery::mock('Tymon\JWTAuth\JWTAuth');

然后将其传递给控制器​​:

$register = new RegisterController($jwt);

然后,您可以在模拟上设置您需要的任何期望,并对应该返回的响应进行硬编码。例如:

$jwt->shouldReceive('getToken')->once()->andReturn('foo');

然后你应该能够调用控制器,只要你嘲笑了对JWTAuth的所有调用,它应该可以工作:

$response = $register->index();

您可能需要参考Mockery的文档来模拟您的所有期望,但这应该可以解决问题。