在 Laravel phpunit 测试中使用 Crypt

Mar*_*cel 1 php encryption phpunit laravel laravel-5

我正在使用 phpunit 和 Laravel 来执行一些测试。我有很多加密的数据库数据。

在我的一次测试中,我填写了一张表格,完成后,数据将使用Crypt::encrypt('data from field goes here').

这是代码:

$this->visit('/requests/create')
             ->seePageIs('/requests/create')
             ->type('FirstNameTest1', 'first_name')
             ->press('Create Request')
             ->see('The request has been created.');

// Fails here
$this->seeInDatabase('requests', ['first_name' => Crypt::encrypt('FirstNameTest1')]);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

无法找到数据库表[要求]排匹配的属性[{“FIRST_NAME”:“eyJpdiI6InFWbGJmSU9rR0NHMjFnMjR4QVVyalE9PSIsInZhbHVlIjoiaDBMcGNxYzdsRlhjNDd3M2E5OGxQbUVkaHhzdEpIOERDcytwQytzZUN4MD0iLCJtYWMiOiJlN2U2MzczYTlhMDgyYTMxOWJmMGQyZDU0MzFiMmZiZjhkMDM1ZjA2YWFhZGVkYTZhMGRkNGMzNDY0ZTAzMjZmIn0 =”}]。

我尝试手动检查记录创建后是否存在,但没有显示。我记得读过一些关于运行测试时数据不持久的内容,所以这是有道理的......但是你能想到在测试期间无法找到该记录的任何原因吗?

pat*_*cus 7

Crypt::encrypt()功能不会创建可重现的哈希。这就是您无法找到记录的原因,因为存储在数据库中的散列将与您要查找的第二个散列不同。

例如,以下是php artisan tinker会话的输出:

>>> Illuminate\Support\Facades\Crypt::encrypt('hello');
=> "eyJpdiI6IlU5bFFhV3JTWHozMklKbjFNc2VqVlE9PSIsInZhbHVlIjoieHZOK2ZSc0pNWlJWeUNYRktVNHc2dz09IiwibWFjIjoiOTI3YjY3MDI5OWJjMTU2M2RhMWFkYmNkOTJmMmE0OTU4MGE5MDNlNTk5NWZiOTgxNjA3Yjk1YTZiNTc1NjAwZCJ9"
>>> Illuminate\Support\Facades\Crypt::encrypt('hello');
=> "eyJpdiI6IjRHWDBvNkFQZmhJSUd0aFByZEFROGc9PSIsInZhbHVlIjoib00waTBpYThRZ3dkNTA5WWUxZWd0QT09IiwibWFjIjoiNzAwYzQ1NzliOTRiODg0M2Y3YTQ0YWIzNWY5NDcwNTJiMDJiYTgxZmJkM2U4MmQ2OWM2OTE3OGY4ZWVhNzgxMCJ9"
Run Code Online (Sandbox Code Playgroud)

如您所见,该Crypt::encrypt()函数连续运行两次,对于相同的文本产生了不同的哈希值。

您需要为您的测试找到不同的断言,例如从数据库中检索记录并检查Crypt::decrypt($first_name) == 'FirstNameTest1'.