【问题标题】:how do I mock the DB facade in laravel?如何在 laravel 中模拟 DB 门面?
【发布时间】:2016-05-02 07:26:26
【问题描述】:

我正在编写单元测试,默认情况下它们不应访问数据库。 按照一般规则,我总是使用 eloquent 来获得结果,但一些更复杂的查询我必须使用原始数据库

我有这个功能:

public function GetPassword($email)
{
    $result = DB::table('vin_user_active')
        ->select(
            "vin_user_active.id",
            "vin_user_active.password",
            DB::raw('COALESCE(
                vin_user_active.pass_update_date <=
                CURRENT_TIMESTAMP -
                INTERVAL vin_org_active.password_expiration_days DAY, 0
        ) AS password_expired')
        )
        ->join('vin_org_active', "vin_user_active.org", "=", "vin_org_active.id")
        ->where("email", "=", $email)
        ->first();

    return $result;
}

现在我在模拟 GetPassword 函数,但是 1.我认为功能应该是私有的,而不是公开的。 2.覆盖率只有%50,因为跳过了整个函数。

我将如何模拟它?现在我有这个

$this->db =Mockery::mock('Illuminate\Database\Query\Builder')->makePartial();

    DB::shouldReceive('table')
        ->once()
        ->with("vin_user_active")
        ->andReturn($this->db);

    DB::shouldReceive('raw')
        ->once()
        ->with(Mockery::any())
        ->andReturn(true);

    DB::shouldReceive('select')
        ->once()
        ->with("vin_user_active.id,
            vin_user_active.password,
            DB::raw('COALESCE(
                vin_user_active.pass_update_date <=
                CURRENT_TIMESTAMP -
                INTERVAL vin_org_active.password_expiration_days DAY, 0
        ) AS password_expired'")
        ->andReturn($this->db);

我真的不知道自己在做什么,我从来没有嘲笑过这么多级别的函数调用。

有什么想法吗?

【问题讨论】:

  • 你不应该模拟 laravel 外观,你也可以在测试中访问数据库,唯一需要注意的是使用事务,这样你的数据库查询就不会被持久化。
  • 欲了解更多信息,请查看laracasts.com/series/phpunit-testing-in-laravel
  • 我尽量避免在单元测试中接触数据库(除了我的集成测试使用数据库事务)
  • @MahmoudTantawy 如果你有数千个测试,你不能等到真正的查询运行,你需要像任何其他副作用(API 调用等)一样模拟它们,所以触摸不好测试中的真实数据库。
  • 一年可以学到很多东西,现在我明白我的评论是多么愚蠢。

标签: php unit-testing laravel mocking mockery


【解决方案1】:

其实很简单

    DB::shouldReceive("raw")
        ->set('query', 'query test')
        ->andReturn(true);

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    相关资源
    最近更新 更多