【问题标题】:Database entry not saved during unit tests when mocked request模拟请求时在单元测试期间未保存数据库条目
【发布时间】:2020-06-20 20:28:18
【问题描述】:
$post= factory(Model)->make();
$this->post(route("post.store", $post->toArray()))->assertSee($model->name);
$this->assertDatabaseHas($this->table, $model->toArray());

此代码有效。但是如果我们模拟请求:

$this->mock(PostRequest::class, function ($mock) {
   $mock->shouldReceive('passes')->andReturn(true);
});

在这种情况下,返回空数据库错误

桌子是空的..

块引用

这怎么可能?

【问题讨论】:

    标签: laravel mocking phpunit


    【解决方案1】:

    make 方法不会将帖子保存到数据库,它只是创建模型。 请改用create 方法将其保存到数据库中。

    改变这个:

    $post= factory(Model)->make();
    

    到这里:

    $post= factory(Model)->create();
    

    【讨论】:

    • 这很清楚。在post.store 控制器中我保存模型
    【解决方案2】:

    你在数据库中没有任何东西,因为你实际上并没有在那里持久化任何东西。我想在post.store 控制器中,您有保持model 的逻辑,这就是它通过的原因。

    在您的模拟中,您不会将任何内容持久化到数据库中,您只是说接收passes 并返回true 并且没有其他任何事情发生,因此,没有任何内容保存到数据库中,这就是为什么$this->assertDatabaseHas($this->table, $model->toArray()); 会告诉您模型没有持久化,因为它针对测试数据库内容进行测试。

    希望这会有所帮助。

    【讨论】:

    • 是的 post.store 控制器我保存模型。我以为我只是伪造验证。有没有办法从控制器制作逻辑并仅伪造验证?
    • 是的,你可以做到。以下是有关如何操作的参考:stackoverflow.com/a/57381415/7770919
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多