php - 使用 symfony2.3 进行单元测试验证器约束

标签 php unit-testing symfony phpunit symfony-validator

我想使用约束制作一个测试单元,但在运行测试时出现此错误

这是我的不同类和运行phpunit后的获取错误

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class Age18 extends Constraint
{
	public $message = 'Vous devez avoir 18 ans.';

}


use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class Age18Validator extends ConstraintValidator
{
	public function validate($dateNaissance, Constraint $constraint)
	{
		if ($dateNaissance > new \DateTime("18 years ago"))
		{
			$this->context->addViolation($constraint->message);
		}
	}
}


use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class Age18ValidatorTest extends \PHPUnit_Framework_TestCase
{
	private $constraint;

	public function setUp()
	{
		$this->constraint = $this->getMock('Symfony\Component\Validator\Constraint');
	}

	public function testValidate()
	{
		/*ConstraintValidator*/
		$validator = new Age18Validator();
		$context = $this
					->getMockBuilder('Symfony\Component\Validator\ExecutionContext')
					->disableOriginalConstructor()
					->getMock('Age18Validator', array('validate'));

		$context->expects($this->once())
				->method('addViolation')
				->with('Vous devez avoir 18 ans.');
		$validator->initialize($context);
		$validator->validate('10/10/2000', $this->constraint);
	}

	public function tearDown()
	{
		$this->constraint = null;
	}
}

Expectation failed for method name is equal to <string:addViolation> when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.

你能帮我解决这个问题吗?

谢谢!!

最佳答案

检查元素的类型:在验证器类中,您在两个 DateTime 对象之间使用比较器,但在测试中,您将一个字符串传递给验证器。

这是我的测试类:

namespace Acme\DemoBundle\Tests\Form;

use Acme\DemoBundle\Validator\Constraints\Age18;
use Acme\DemoBundle\Validator\Constraints\Age18Validator;

class Age18ValidatorTest extends \PHPUnit_Framework_TestCase
{
    private $constraint;
    private $context;

    public function setUp()
    {
        $this->constraint = new Age18();
        $this->context = $this->getMockBuilder('Symfony\Component\Validator\ExecutionContext')->disableOriginalConstructor()->getMock();
    }

    public function testValidate()
    {


        /*ConstraintValidator*/
        $validator = new Age18Validator();
        $validator->initialize( $this->context);

        $this->context->expects($this->once())
            ->method('addViolation')
            ->with($this->constraint->message,array());
        $validator->validate(\Datetime::createFromFormat("d/m/Y","10/10/2000"), $this->constraint);
    }

    public function tearDown()
    {
        $this->constraint = null;
    }
}

希望对你有帮助

关于php - 使用 symfony2.3 进行单元测试验证器约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26550521/

相关文章:

php - Prestashop - 如何将自定义输入字段添加到产品自定义并写入数据库

php - Yii2 xml 文件响应

php - 如何从 Laravel Passport 中的刷新 token 获取 id?

javascript - Karma/jasmine Angular 指令提交点击单元测试在成组运行时失败,但不是单独运行

unit-testing - 你在哪里设置 OrmLiteConfig.DialectProvider.NamingStrategy 在单元测试中?

javascript - 如何使用 Ajax 和 JQuery 调用带参数的 php 函数

javascript - 模拟命名导入和构造函数 ES6 和 Ava

symfony - 如何在 Twig 中渲染带有多个参数的 Controller ?

php - 将基于 Symfony 2.0 的项目更新到 Symfony 2.2

php - symfony2 上的序列化()