簡體   English   中英

在 Laravel phpunit 測試中使用 Crypt

[英]Using Crypt with Laravel phpunit tests

我在 Laravel 中使用 phpunit 來執行一些測試。 我有很多加密的數據庫數據。

在我的一個測試中,我填寫了一個表格,一旦完成,數據就會使用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')]);

我收到以下錯誤消息:

Unable to find row in database table [requests] that matched attributes [{"first_name":"eyJpdiI6InFWbGJmSU9rR0NHMjFnMjR4QVVyalE9PSIsInZhbHVlIjoiaDBMcGNxYzdsRlhjNDd3M2E5OGxQbUVkaHhzdEpIOERDcytwQytzZUN4MD0iLCJtYWMiOiJlN2U2MzczYTlhMDgyYTMxOWJmMGQyZDU0MzFiMmZiZjhkMDM1ZjA2YWFhZGVkYTZhMGRkNGMzNDY0ZTAzMjZmIn0="}].

我嘗試手動檢查記錄創建后是否存在,但沒有顯示。 我記得讀過一些關於運行測試時數據不持久的內容,所以這是有道理的......但是你能想到在測試期間它無法找到該記錄的任何原因嗎?

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'

我知道這是一個舊線程,但我想提供另一種允許使用assertDatabaseHas的解決方案。

$this->app->instance('encrypter', tap(Mockery::mock(), function ($mock) {
    $mock
        ->shouldReceive('encrypt')->once()
        ->with('111223333', true)
        ->andReturnArg(0);
}));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM