【问题标题】:Laravel model mockLaravel 模型模拟
【发布时间】:2023-03-22 21:45:02
【问题描述】:

我正在尝试模拟模型并在插入时返回 false,以便我可以测试失败案例。

这是我的测试模拟

$mockModel = Mockery::mock(\App\Models\MyModel::class)->shouldReceive(['insertGetId'])->once()->andReturn(false);

这是我在控制器中的插入方法

$result = MyModel::insertGetId(['something' => 'somevalue',]);
dd($result);

我期望 $result 为假,但我得到的是 id (int)。

如果我删除 dd();我在终端上收到此错误。

Mockery\Exception\InvalidCountException: Method insertGetId() from Mockery_0_App_Models_MyModel should be called
 exactly 1 times but called 0 times.

【问题讨论】:

    标签: php laravel unit-testing mocking mockery


    【解决方案1】:

    您正在使用 insertGetId() 来返回插入的 id。请改用 insert()

    如果表有一个自增的 id,使用 insertGetId 方法插入一条记录,然后检索 ID,如:

    $id = DB::table('users')->insertGetId(
        ['email' => 'john@example.com', 'votes' => 0]
    );
    

    但在插入的情况下,它会根据查询的成功或失败返回真或假。

    【讨论】:

    • 谢谢,但我还是明白了。 mockery 应该被拦截并返回 false。
    • 如果我使用 insert 那么我将如何获得最后一个 insertid?
    • 你可以检查一下返回值是否为0即false,如果插入成功则返回肯定大于0的id
    • 总是大于 0,Mockery::mock 不工作。
    • 如果我删除 dd() 我得到这个 Mockery\Exception\InvalidCountException: Method insertGetId() from Mockery_0_App_Models_MyModel 应该被调用 1 次但调用 0 次。
    猜你喜欢
    • 2015-08-08
    • 2020-02-29
    • 2015-03-12
    • 2014-11-05
    • 2018-05-25
    • 2020-09-11
    • 2016-08-17
    • 2021-12-23
    • 2014-01-29
    相关资源
    最近更新 更多