簡體   English   中英

Mocking laravel DB門面當方法使用嘲弄/嘲弄

[英]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代碼。

測試該代碼的方法是對每種情況進行功能或單元測試:

  1. 獲取所有users (甚至是具有email_verified_atusers )。
  2. 獲取所有email_verified_atnullusers

在這兩種情況下,您都必須讓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.

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