我正在使用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 ="}]。
我尝试手动检查创建后是否存在该记录并且未显示该记录。我记得在运行测试时阅读有关数据不存在的内容,这样才有意义......但是你能否想出为什么在测试期间无法找到该记录的任何原因?
答案 0 :(得分:4)
db.student.find({"nameIdentity.name":"a"})
功能不会创建可重现的哈希。这就是您无法找到记录的原因,因为存储在数据库中的哈希值与您正在查找的第二个哈希值不同。
例如,下面是db.student.find({"nameIdentity.name":"a"},{"nameIdentity.sourceReferenceId.sourceName":"b"})
会话的输出:
Crypt::encrypt()
正如您所看到的,php artisan tinker
函数连续两次运行同一文本会生成不同的哈希值。
您需要为测试找到不同的断言,例如从数据库中检索记录并检查是否>>> Illuminate\Support\Facades\Crypt::encrypt('hello');
=> "eyJpdiI6IlU5bFFhV3JTWHozMklKbjFNc2VqVlE9PSIsInZhbHVlIjoieHZOK2ZSc0pNWlJWeUNYRktVNHc2dz09IiwibWFjIjoiOTI3YjY3MDI5OWJjMTU2M2RhMWFkYmNkOTJmMmE0OTU4MGE5MDNlNTk5NWZiOTgxNjA3Yjk1YTZiNTc1NjAwZCJ9"
>>> Illuminate\Support\Facades\Crypt::encrypt('hello');
=> "eyJpdiI6IjRHWDBvNkFQZmhJSUd0aFByZEFROGc9PSIsInZhbHVlIjoib00waTBpYThRZ3dkNTA5WWUxZWd0QT09IiwibWFjIjoiNzAwYzQ1NzliOTRiODg0M2Y3YTQ0YWIzNWY5NDcwNTJiMDJiYTgxZmJkM2U4MmQ2OWM2OTE3OGY4ZWVhNzgxMCJ9"
。
答案 1 :(得分:0)
我知道这是一个旧线程,但是我想提供另一种允许使用assertDatabaseHas
的解决方案。
$this->app->instance('encrypter', tap(Mockery::mock(), function ($mock) {
$mock
->shouldReceive('encrypt')->once()
->with('111223333', true)
->andReturnArg(0);
}));