2015-03-07 5 views
4

Я использую Symfony2 (2.6) PHPUnit. Я хотел бы узнать, как модуль проверки ограничения валидатор в Symfony 2,6Ограничения валидатора модулей тестирования

пароль ограничение

<?php 

namespace Test\MainBundle\Component\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 

class Password extends Constraint 
{ 
    public $message = "user.password_regex"; 
} 

Ограничение валидатор пароля

<?php 

namespace Test\MainBundle\Component\Validator\Constraints; 

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

class PasswordValidator extends ConstraintValidator 
{ 
    public function validate($value, Constraint $constraint) 
    { 
     if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z0-9]{6,}+$/', $value, $matches)) { 
      $this->context->buildViolation($constraint->message) 
       ->setParameter('%string%', $value) 
       ->addViolation(); 
    } 
} 

И мой тест попробовать

<?php 

namespace Test\MainBundle\Tests\Component\Validator\Constraints; 

use Test\MainBundle\Component\Validator\Constraints\Password; 
use Test\MainBundle\Component\Validator\Constraints\PasswordValidator; 

class PasswordTest extends \PHPUnit_Framework_TestCase 
{ 
    private $constraint; 

    public function setUp() 
    { 
     $this->constraint = new Password(); 
    } 

    public function testFailureValidate() 
    { 
     $context = $this 
      ->getMockBuilder('Symfony\Component\Validator\ExecutionContext') 
      ->disableOriginalConstructor() 
      ->getMock(); 
     $context 
      ->expects($this->once()) 
      ->method('buildViolation') 
      ->with($this->constraint->message, array()); 

     $validator = new PasswordValidator(); 

     $validator->initialize($context); 
     $validator->validate('test', $this->constraint); 
    } 

    public function testSuccessValidate() 
    { 
     $validator = new PasswordValidator(); 
     $context = $this 
      ->getMockBuilder('Symfony\Component\Validator\ExecutionContext') 
      ->disableOriginalConstructor() 
      ->getMock(); 
     $validator->initialize($context); 
     $validator->validate('Testing007', $this->constraint); 
    } 
} 

Пожалуйста, не могли бы вы помочь мне решить эту проблему?

Заранее спасибо.

Если у вас есть хороший образец об модульном тестировании в приложении symfony2, мне очень интересно.

+0

Где конкретно в тесте сделать что-то пойдет не так? – Oldskool

+0

На самом деле я получаю PHP Неустранимая ошибка: вызов неопределенного метода Mock_ExecutionContext_a2d8943d :: buildViolation() на testFailureValidate() – gab89

+2

Проблема может быть вызвана издевательским контекстом Symfony (setParameter, addViolation не издевается). Обычно я не тестирую этот шаблон Symfony (меня не интересуют ограничения, контекст и нарушения). Я просто извлекаю метод из 'if' и проверяю только метод, который возвращает boolean. В вашем случае я бы опробовал открытый метод 'isPasswordInvalid'. –

ответ

0

Мы можем довольно легко издеваться «setParameter» и «addViolation» методы

что-то вроде этого:

... 

/** 
* @test 
* @dataProvider invalidTextProvider 
*/ 
public function invalidItems($text) 
{ 
    $context = $this->getMockExecutionContext(); 
    $context->expects($this->once()) 
     ->method('buildViolation') 
     ->with($this->constraint->message) 
     ->willReturn($this->getMockConstraintViolationBuilder()) 
    ; 

    $this->validator->initialize($context); 
    $this->validator->validate($text, $this->constraint); 
} 

/** 
* @return mixed 
*/ 
private function getMockExecutionContext() 
{ 
    $context = $this->getMockBuilder('Symfony\Component\Validator\ExecutionContext') 
     ->disableOriginalConstructor() 
     ->setMethods(array('buildViolation')) 
     ->getMock() 
    ; 
    return $context; 
} 

private function getMockConstraintViolationBuilder() 
{ 
    $constraintViolationBuilder = $this->getMockBuilder('Symfony\Component\Validator\Violation\ConstraintViolationBuilder') 
     ->disableOriginalConstructor() 
     ->getMock() 
    ; 
    $constraintViolationBuilder 
     ->method('setParameter') 
     ->willReturn($constraintViolationBuilder); 
    $constraintViolationBuilder 
     ->method('addViolation'); 
    return $constraintViolationBuilder; 
} 

... 
Смежные вопросы