[英]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.