繁体   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