首页 > 解决方案 > 如何在 laravel 中对控制器进行单元测试?

问题描述

这是测试功能

 public function testCreateSuccess(){

        $user=['first_name'=>"heba",'last_name'=>"chakaron",'email'=>"hebachakaron@gmail.com",'password'=> "123456"];
        $userReturned=['first_name'=>"heba",'last_name'=>"chakaron",'email'=>"hebachakaron@gmail.com",'password'=> Hash::make('123456')];
        $userRequest = UserRegisterRequest::create("http://127.0.0.1:8000/api/users/", 'POST',[
            'first_name'=>"heba",
            'last_name'=>"chakaron",
            'email'=>"hebachakaron@gmail.com",
            'password'=>'123456',
            'password_confirmation'=>'123456'
        ]);
        /**
        * @var UserService|\Mockery\MockInterface|\Mockery\LegacyMockInterface
        */ 
        $mock=Mockery::mock(UserService::class);
        $mock->shouldReceive('create')->with($user)
        ->once()
        ->andReturn($userReturned);
        $this->userController=new UserController($mock);
        $this->app->instance('App\Services\UserService', $mock);
        $created=$this->userController->create($userRequest);
        $this->assertSame($created['password'],$userReturned['password']);
    }

这是控制器

class UserController extends Controller
{
    //
    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }
    
    
    public function create(UserRegisterRequest $request)
    {
        $data = $this->userService->create($request->validated());
        return HTTPResponse::ok($data);
    }
}

这是用户注册请求

class UserRegisterRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'first_name' => 'required|string|max:255',
            'last_name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ];
    }
}

当我运行这个 testCreateSuccess 时,它返回 There was 1 error:

  1. Tests\Unit\UserTest::testCreateSuccess 错误:在 null 上调用成员函数验证()并且错误在线$created=$this->userController->create($userRequest)

标签: laravelunit-testingcontrollerphpunit

解决方案


推荐阅读