使用phpunit测试尝试捕获存储方法以测试异常

时间:2018-10-18 08:13:03

标签: javascript php laravel phpunit

我要测试此功能:

public function store(array $input){

        \DB::beginTransaction();

        try{

            $input['name'] = $input['first_name'].$input['last_name'];
            $input['password'] = str_random(7);

            $user = $this->model->create($input);

            $role_user = new RoleUser();
            $role_user->role_id = $input['role_id'];
            $role_user->user_id = $user->id;
            $role_user->save();

            \DB::commit();

            return $user;

        }catch (Exception $e){

            \DB::rollback();
            return false;
        }

    }

这是我的测试

/** @test */
    public function testUserRepoStoreFail()
    {
        $roleUser = factory(\App\Models\RoleUser::class)->create();
        $role = factory(\App\Models\Role::class)->create();

        $this->expectException(Exception::class);

        $data =[
            'role_id' => $role->id,
            'name' => $this->faker->name,
            'first_name' => $this->faker->name,
            'last_name' => $this->faker->name,
            'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
            'remember_token' => str_random(10),
        ];

        $rep = new UserRepositoryEloquent($this->container);
//
        $user = $rep->store($data);


    }

我删除了电子邮件以使存储功能失败

当我这样做时,我得到:

  

1)Tests \ Unit \ AuthTest :: testUserRepoStoreFail断言抛出“ Exception”类型的异常失败。**

2 个答案:

答案 0 :(得分:2)

即使抛出异常,它也会被捕获并在store方法内进行处理。 expectException期待未处理的异常。 如果要在方法中测试catch块,则必须断言DB::rollback()已被调用,或者只是断言该方法返回false而不是用户实例。

答案 1 :(得分:0)

该测试未通过,可能是因为当您错过电子邮件时未引发任何异常。进行手动测试时,检查是否收到任何异常。如果不是这样,请尝试自己添加一个例外:

public function store(array $input){

        \DB::beginTransaction();

        try{

            $input['name'] = $input['first_name'].$input['last_name'];
            $input['password'] = str_random(7);

            //Add this check
            if(empty($input['email'])){
                throw new \InvalidArgumentException("Email is empty");
            }

            $user = $this->model->create($input);

            $role_user = new RoleUser();
            $role_user->role_id = $input['role_id'];
            $role_user->user_id = $user->id;
            $role_user->save();

            \DB::commit();

            return $user;

        }catch (Exception $e){

            \DB::rollback();
            return false;
        }

    }