gpt4 book ai didi

php - 如何在 Laravel 5 中测试自定义验证规则?

转载 作者:行者123 更新时间:2023-12-02 04:21:06 24 4
gpt4 key购买 nike

我在 Laravel 中创建了一个自定义验证规则,并在服务提供商的 register() 方法中扩展了它,我想测试它,但不知道如何测试。

我看了一下Laravel framework's validation tests ,但我无法理解 getTranslator()getRealTranslator() 方法的用途。

有人可以给我一些关于如何测试 Laravel 自定义验证规则的提示吗?

编辑

这就是我所做的:

创建了一个ValidatorServiceProvider,如下所示:

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ValidatorServiceProvider extends ServiceProvider {

/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
$this->app['validator']->extend('greater_than', function($attr, $val, $params)
{
return false;
});
}

/**
* Register the application services.
*
* @return void
*/
public function register()
{
}
}

还将其添加到提供者数组中并发出composer dump-autoload -o

将以下内容添加到tests\CustomValidationRulesTest.php:

<?php

use Mockery as m;
use Illuminate\Validation\Validator;

class CustomValidationRulesTest extends TestCase {

public function tearDown()
{
m::close();
}

public function testValidateGreaterThan()
{
$trans = $this->getTranslator();

$rules = [
'field2' => 'greater_than:field1'
];

$data = [
'field1' => 1,
'field2' => 2
];

$v = new Validator($trans, $data, $rules);
$this->assertTrue($v->passes());
}

protected function getTranslator()
{
return m::mock('Symfony\Component\Translation\TranslatorInterface');
}

protected function getRealTranslator()
{
$trans = new Symfony\Component\Translation\Translator('en', new Symfony\Component\Translation\MessageSelector);
$trans->addLoader('array', new Symfony\Component\Translation\Loader\ArrayLoader);
return $trans;
}

}

运行 PHPUnit 会得到以下结果:

PHPUnit 4.6.6 by Sebastian Bergmann and contributors.

Configuration read from /home/ubuntu/workspace/phpunit.xml

E.

Time: 248 ms, Memory: 14.75Mb

There was 1 error:

1) CustomValidationRulesTest::testValidateGreaterThan
BadMethodCallException: Method [validateGreaterThan] does not exist.

/home/ubuntu/workspace/vendor/laravel/framework/src/Illuminate/Validation/Validator.php:2615
/home/ubuntu/workspace/vendor/laravel/framework/src/Illuminate/Validation/Validator.php:372
/home/ubuntu/workspace/vendor/laravel/framework/src/Illuminate/Validation/Validator.php:372
/home/ubuntu/workspace/vendor/laravel/framework/src/Illuminate/Validation/Validator.php:325
/home/ubuntu/workspace/tests/CustomValidationRulesTest.php:27

我做错了什么?

谢谢!

最佳答案

您需要更多地了解ContainerIoC以及Validator如何在那里注册。

Laravel 将 Illuminate\Validation\Factory 的实例注册为 validator。因此,如果您检查 \Illuminate\Support\Facades\Validator,您会发现它解析为 Factory。当您扩展验证器时,您实际上是在 Factory 中添加扩展。现在,调用 Validator::make() 会调用具有扩展的 Factory,它会使用扩展创建 Validator,同时实例化一个新的Illuminate\Validation\Validator 将无法解析 Factory 中的扩展。

您不应实例化新的 Validator,而应使用 app('validator')->make()

关于php - 如何在 Laravel 5 中测试自定义验证规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com