我使用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')]);我收到以下错误消息:
无法在数据库表请求中找到与属性{"first_name":"eyJpdiI6InFWbGJmSU9rR0NHMjFnMjR4QVVyalE9PSIsInZhbHVlIjoiaDBMcGNxYzdsRlhjNDd3M2E5OGxQbUVkaHhzdEpIOERDcytwQytzZUN4MD0iLCJtYWMiOiJlN2U2MzczYTlhMDgyYTMxOWJmMGQyZDU0MzFiMmZiZjhkMDM1ZjA2YWFhZGVkYTZhMGRkNGMzNDY0ZTAzMjZmIn0="}.匹配的行
我尝试手动检查记录在创建后是否存在,但没有显示出来。我记得在运行测试时,我读过一些关于数据不持久化的东西,所以这是有道理的.但是你能想出为什么它在测试中找不到记录的原因吗?
发布于 2016-01-12 05:53:15
Crypt::encrypt()功能不创建可重复的散列。这就是您无法找到记录的原因,因为存储在数据库中的哈希将不同于您要查找的第二个哈希。
例如,下面是php artisan tinker会话的输出:
>>> Illuminate\Support\Facades\Crypt::encrypt('hello');
=> "eyJpdiI6IlU5bFFhV3JTWHozMklKbjFNc2VqVlE9PSIsInZhbHVlIjoieHZOK2ZSc0pNWlJWeUNYRktVNHc2dz09IiwibWFjIjoiOTI3YjY3MDI5OWJjMTU2M2RhMWFkYmNkOTJmMmE0OTU4MGE5MDNlNTk5NWZiOTgxNjA3Yjk1YTZiNTc1NjAwZCJ9"
>>> Illuminate\Support\Facades\Crypt::encrypt('hello');
=> "eyJpdiI6IjRHWDBvNkFQZmhJSUd0aFByZEFROGc9PSIsInZhbHVlIjoib00waTBpYThRZ3dkNTA5WWUxZWd0QT09IiwibWFjIjoiNzAwYzQ1NzliOTRiODg0M2Y3YTQ0YWIzNWY5NDcwNTJiMDJiYTgxZmJkM2U4MmQ2OWM2OTE3OGY4ZWVhNzgxMCJ9"如您所见,对于同一文本,Crypt::encrypt()函数在一行中运行两次,产生不同的散列。
您需要为您的测试找到一个不同的断言,例如从数据库中检索记录和检查是否是Crypt::decrypt($first_name) == 'FirstNameTest1'。
发布于 2020-10-28 19:01:08
我知道这是一个旧线程,但我想提供另一个允许使用assertDatabaseHas的解决方案。
$this->app->instance('encrypter', tap(Mockery::mock(), function ($mock) {
$mock
->shouldReceive('encrypt')->once()
->with('111223333', true)
->andReturnArg(0);
}));https://stackoverflow.com/questions/34736070
复制相似问题