Php 拉威尔模型

Php 拉威尔模型,php,laravel,unit-testing,mocking,mockery,Php,Laravel,Unit Testing,Mocking,Mockery,我试图模拟一个模型,并在插入时返回false,以便测试失败案例 这是我的模拟测试 $mockModel = Mockery::mock(\App\Models\MyModel::class)->shouldReceive(['insertGetId'])->once()->andReturn(false); 这是我在控制器中的插入方法 $result = MyModel::insertGetId(['something' => 'somevalue',]); dd($r

我试图模拟一个模型,并在插入时返回false,以便测试失败案例

这是我的模拟测试

$mockModel = Mockery::mock(\App\Models\MyModel::class)->shouldReceive(['insertGetId'])->once()->andReturn(false);
这是我在控制器中的插入方法

$result = MyModel::insertGetId(['something' => 'somevalue',]);
dd($result);
我希望$result为false,但我得到的是id(int)

如果我删除dd();我在终端上发现了这个错误

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

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

如果表具有自动递增的id,请使用insertGetId方法插入一条记录,然后检索id,如下所示:

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

但是,如果使用insert,它将根据查询的成功或失败返回true或false。

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

如果表具有自动递增的id,请使用insertGetId方法插入一条记录,然后检索id,如下所示:

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

但如果是insert,它会根据查询的成功与否返回true或false。

谢谢,但我还是得到了true。Mockry应该拦截并返回false。另外,如果我使用insert,那么如何获取最后一个insertid?您可以设置一个检查,例如返回值是否为0 ie false,如果插入成功,它将返回肯定大于0的id。它始终大于0,Mockry::mock不起作用。此外,如果我删除dd()我从mockry\u 0\u App\u Models\u MyModel中得到了mockry\Exception\InvalidCountException:Method insertGetId(),应该精确调用1次,但调用了0次。谢谢,但我还是得到了答案。Mockry应该拦截并返回false。另外,如果我使用insert,那么如何获取最后一个insertid?您可以设置一个检查,例如返回值是否为0 ie false,如果插入成功,它将返回肯定大于0的id。它始终大于0,Mockry::mock不起作用。此外,如果我删除dd()我从mockry\u 0\u App\u Models\u MyModel中得到这个mockry\Exception\InvalidCountException:Method insertGetId()应该被精确调用1次,但调用0次。