【问题标题】:How can I mock unique validation rule?如何模拟唯一验证规则?
【发布时间】:2017-06-16 18:13:12
【问题描述】:

我正在为ResourceControllerstore() 函数编写测试用例,它在数据库中添加了一个新资源。

我不允许在我的测试用例中访问数据库,所以我正在模拟所有数据库交互 & 现在我需要模拟 unique 验证规则。

我在 Google 上搜索过它,甚至在 stackoverflow 上搜索过,但我没有 找到任何具体的东西。

这是我所知道的:- 我可以模拟 \Validator::getPresenceVerifier() & \Validator::setPresenceVerifier() 但如果我模拟它们,那么我将无法制作验证器对象。 StackOverflow Question Here

谁能指引我正确的方向。

【问题讨论】:

    标签: php unit-testing mocking laravel-5.1


    【解决方案1】:

    好的,这里有一些想法:首先,Validator 是一个外观,这意味着您可以使用 Validator::shouldReceive 模拟它的任何方法。您还可以使用Validator::swap($mock) 模拟整个根对象。如果您的控制器使用$this->validate,您还可以通过替换内部验证器实例来模拟验证器 - 我怀疑您甚至可以在创建控制器时使用 IoC 容器来注入它。

    如果一切都失败了,您还可以通过创建控制器的模拟来测试该方法,然后在您的控制器模拟上调用该方法 - 这样您就可以模拟其他内部方法(例如验证)。您可以直接测试该方法,或再次使用App::bind 映射您的模拟,以便它从调用方法触发。

    如果您使用自定义请求类进行验证,您还可以尝试模拟该类以完全禁用验证,或者使用自定义验证函数而不是唯一测试将其替换为您自己的验证器。

    【讨论】:

    • 我正在使用Validator::make() 函数来验证我的数据。您能否提供一个示例代码来参考您的建议(如果要求不高的话)。我仍然无法完全理解你。
    • @ManishYadav make() 给你一个验证器对象,它不做验证(还)。所以首先创建一个模拟对象 $mock,并让它覆盖失败方法以返回 false。然后使用 Validator::shouldReceive('make')->andReturn($mock) 以便调用 Validator::make 将返回您的模拟对象。控制器将调用 make(),获取模拟对象,然后调用失败(),你已经模拟了,所以它会认为验证通过而不做。
    • @Benuibird,但我也想测试其他验证,我只想覆盖unique验证,其他验证应该验证
    • @ManishYadav 听起来您真正想要的是模拟数据库连接。如果您希望其他一切正常运行。试试吧。
    猜你喜欢
    • 2016-04-08
    • 2015-02-27
    • 1970-01-01
    • 2019-12-14
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2016-08-03
    相关资源
    最近更新 更多