首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Crypt与Laravel相单元试验

Crypt与Laravel相单元试验
EN

Stack Overflow用户
提问于 2016-01-12 05:15:14
回答 2查看 1.8K关注 0票数 3

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

在我的一次测试中,我填写了一份表单,一旦完成,数据就会使用Crypt::encrypt('data from field goes here')加密。

以下是代码:

代码语言:javascript
复制
$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')]);

我收到以下错误消息:

无法在数据库表请求中找到与属性{"first_name":"eyJpdiI6InFWbGJmSU9rR0NHMjFnMjR4QVVyalE9PSIsInZhbHVlIjoiaDBMcGNxYzdsRlhjNDd3M2E5OGxQbUVkaHhzdEpIOERDcytwQytzZUN4MD0iLCJtYWMiOiJlN2U2MzczYTlhMDgyYTMxOWJmMGQyZDU0MzFiMmZiZjhkMDM1ZjA2YWFhZGVkYTZhMGRkNGMzNDY0ZTAzMjZmIn0="}.匹配的行

我尝试手动检查记录在创建后是否存在,但没有显示出来。我记得在运行测试时,我读过一些关于数据不持久化的东西,所以这是有道理的.但是你能想出为什么它在测试中找不到记录的原因吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-12 05:53:15

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

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

代码语言:javascript
复制
>>> Illuminate\Support\Facades\Crypt::encrypt('hello');
=> "eyJpdiI6IlU5bFFhV3JTWHozMklKbjFNc2VqVlE9PSIsInZhbHVlIjoieHZOK2ZSc0pNWlJWeUNYRktVNHc2dz09IiwibWFjIjoiOTI3YjY3MDI5OWJjMTU2M2RhMWFkYmNkOTJmMmE0OTU4MGE5MDNlNTk5NWZiOTgxNjA3Yjk1YTZiNTc1NjAwZCJ9"
>>> Illuminate\Support\Facades\Crypt::encrypt('hello');
=> "eyJpdiI6IjRHWDBvNkFQZmhJSUd0aFByZEFROGc9PSIsInZhbHVlIjoib00waTBpYThRZ3dkNTA5WWUxZWd0QT09IiwibWFjIjoiNzAwYzQ1NzliOTRiODg0M2Y3YTQ0YWIzNWY5NDcwNTJiMDJiYTgxZmJkM2U4MmQ2OWM2OTE3OGY4ZWVhNzgxMCJ9"

如您所见,对于同一文本,Crypt::encrypt()函数在一行中运行两次,产生不同的散列。

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

票数 10
EN

Stack Overflow用户

发布于 2020-10-28 19:01:08

我知道这是一个旧线程,但我想提供另一个允许使用assertDatabaseHas的解决方案。

代码语言:javascript
复制
$this->app->instance('encrypter', tap(Mockery::mock(), function ($mock) {
    $mock
        ->shouldReceive('encrypt')->once()
        ->with('111223333', true)
        ->andReturnArg(0);
}));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34736070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档