如何在 Laravel 5 中测试自定义验证规则?
How to test custom validation rules in Laravel 5?
我在 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()
{
}
}
也将其添加到providers数组并发出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
我做错了什么?
谢谢!
您需要进一步了解 Container
或 IoC
以及 Validator
是如何在那里注册的。
Laravel 将 Illuminate\Validation\Factory
的实例注册为 validator
。因此,如果您检查 \Illuminate\Support\Facades\Validator
,您会发现它解析为 Factory
。当您扩展验证器时,您实际上是在 Factory
中添加一个扩展。现在,调用 Validator::make()
会调用具有扩展名的 Factory
并创建具有扩展名的 Validator
,而实例化新的 Illuminate\Validation\Validator
将无法解析扩展名来自 Factory
.
您不应实例化新的 Validator
,而应使用 app('validator')->make()
。
拿去:
protected function getRealTranslator()
{
$loader = new \Illuminate\Translation\ArrayLoader;
$translator = new \Illuminate\Translation\Translator($loader, 'ja');
return $translator;
}
我在 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()
{
}
}
也将其添加到providers数组并发出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
我做错了什么?
谢谢!
您需要进一步了解 Container
或 IoC
以及 Validator
是如何在那里注册的。
Laravel 将 Illuminate\Validation\Factory
的实例注册为 validator
。因此,如果您检查 \Illuminate\Support\Facades\Validator
,您会发现它解析为 Factory
。当您扩展验证器时,您实际上是在 Factory
中添加一个扩展。现在,调用 Validator::make()
会调用具有扩展名的 Factory
并创建具有扩展名的 Validator
,而实例化新的 Illuminate\Validation\Validator
将无法解析扩展名来自 Factory
.
您不应实例化新的 Validator
,而应使用 app('validator')->make()
。
拿去:
protected function getRealTranslator()
{
$loader = new \Illuminate\Translation\ArrayLoader;
$translator = new \Illuminate\Translation\Translator($loader, 'ja');
return $translator;
}