如何在 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

我做错了什么?

谢谢!

您需要进一步了解 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()

拿去:

protected function getRealTranslator()
    {
        $loader = new \Illuminate\Translation\ArrayLoader;
        $translator = new \Illuminate\Translation\Translator($loader, 'ja');
        return $translator;
    }