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

Php JWT和具有依赖注入的单元测试,php,laravel,unit-testing,dependency-injection,Php,Laravel,Unit Testing,Dependency Injection,我是OOP PHP领域的新手,所以如果我做错了什么,请随时纠正我 为了使用JWT(JSON Web Token)函数,我需要在构造函数中实例化它,而使用test\u registration\u input\u validation,我尝试在RegisterController中为方法编写单元测试,但我无法访问它们,因为我无法实例化RegisterController。构造函数有一个输入参数,JWTAuth有它自己的输入参数,所以它是一个无止境的循环。有什么想法吗 class RegisterC

我是OOP PHP领域的新手,所以如果我做错了什么,请随时纠正我

为了使用JWT(JSON Web Token)函数,我需要在构造函数中实例化它,而使用test\u registration\u input\u validation,我尝试在RegisterController中为方法编写单元测试,但我无法访问它们,因为我无法实例化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());

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

我注意到您已经在使用依赖项注入来插入JWTAuth,这将使插入变得更容易。您可以创建JWTAuth的模拟,如下所示:

$jwt = Mockery::mock('Tymon\JWTAuth\JWTAuth');
然后将其传递给控制器:

$register = new RegisterController($jwt);
然后,您可以在模拟上设置所需的任何期望,并硬编码它应该返回的响应。例如:

$jwt->shouldReceive('getToken')->once()->andReturn('foo');
然后您应该能够调用控制器,只要您模拟了对JWTAuth的所有调用,它就应该可以工作:

$response = $register->index();

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

很抱歉,我没有时间测试它。我现在就做!很有效,谢谢你,马修!我将更深入地了解Mockery,很高兴听到这个消息。如果答案解决了问题,请接受它。