使用Crypt与Laravel phpunit测试

时间:2016-01-12 05:15:14

标签: php laravel encryption laravel-5 phpunit

我正在使用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 ="}]。

我尝试手动检查创建后是否存在该记录并且未显示该记录。我记得在运行测试时阅读有关数据不存在的内容,这样才有意义......但是你能否想出为什么在测试期间无法找到该记录的任何原因?

2 个答案:

答案 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);
}));