如何在laravel中模拟DB外观?

时间:2016-01-25 20:37:50

标签: php unit-testing laravel mocking mockery

我正在编写我的单元测试,默认情况下他们不应该点击数据库。 按照一般规则我总是使用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函数,但是 我认为这个功能应该是私人的,而不是公开的。 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);

老实说,我不知道自己在做什么,我从未嘲笑过如此多级别的函数调用。

任何想法?

1 个答案:

答案 0 :(得分:1)

实际上这很简单

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