[英]Mocking laravel DB facades when method using mockery/mockery
我在單元測試中使用嘲弄/嘲弄來模擬 laravel db 外觀。 但我不知道如何為 when 方法創建存根。 所以這是我想要測試的 class。
<?php
namespace App;
use Illuminate\Support\Facades\DB;
class TestRepo
{
public function testQb()
{
DB::table('users')
->when(true, function($query) {
$query->where('email_verified_at', null);
})
->get();
}
}
我想確保查詢構建器運行包括關閉的when
方法。
到目前為止,我在沒有when
方法的存根的情況下進行了這個測試
public function test_example()
{
DB::shouldReceive('table')->once()->with('users')->andReturnSelf();
DB::shouldReceive('get')->once()->andReturn(collect(new User()));
(new TestRepo())->testQb();
$this->assertTrue(true);
}
這將測試將失敗,因為我在方法when
沒有 laravel db 外觀的存根。
有人可以告訴我如何實現這一目標嗎? 先感謝您。
Mockery 可以模擬方法鏈,如此 處所述。
DB::shouldReceive('table->when->get')->andReturn(collect(new User()));
但是由於通過避免with()
來減少斷言,我建議斷言返回數據。
您不必這樣做,您實際上是在測試 Facade 而不是您的邏輯/流程。 您絕不能測試已經測試過的core
代碼。
測試該代碼的方法是對每種情況進行功能或單元測試:
users
(甚至是具有email_verified_at
的users
)。email_verified_at
為null
的users
。 在這兩種情況下,您都必須讓users
同時滿足這兩個條件,並且只有第一個條件會返回 all users
,但第二個不應該返回一個用戶,因為email_verified_at
不是null
。
您的查詢可以升級:
use Illuminate\Database\Eloquent\Builder;
User::when(true, function (Builder $query) {
return $query->whereNull('email_verified_at');
})
->get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.