gpt4 book ai didi

validation - 单元测试 Symfony 回调

转载 作者:行者123 更新时间:2023-12-03 09:46:50 24 4
gpt4 key购买 nike

您好,需要一些帮助来联合测试 Symfony 2.8 回调。我认为我没有正确设置它,因为当我知道它应该失败时测试通过了

实体设置:

联系人实体中的验证回调:

 /**
* Validation callback for contact
* @param \AppBundle\Entity\Contact $object
* @param ExecutionContextInterface $context
*/
public static function validate(Contact $object, ExecutionContextInterface $context)
{
/**
* Check if the country code is valid
*/
if ($object->isValidCountryCode() === false) {
$context->buildViolation('Cannot register in that country')
->atPath('country')
->addViolation();
}
}

Contact实体中的方法isValidCountryCode:

/**
* Get a list of invalid country codes
* @return array Collection of invalid country codes
*/
public function getInvalidCountryCodes()
{
return array('IS');
}

判断国家代码是否无效的方法:

/**
* Check if the country code is valid
* @return boolean
*/
public function isValidCountryCode()
{
$invalidCountryCodes = $this->getInvalidCountryCodes();
if (in_array($this->getCountry()->getCode(), $invalidCountryCodes)) {
return false;
}
return true;
}

验证.yml

AppBundle\Entity\Contact:
properties:
//...

country:
//..
- Callback:
callback: [ AppBundle\Entity\Contact, validate ]
groups: [ "AppBundle" ]

测试类:

//..
use Symfony\Component\Validator\Validation;

class CountryTest extends WebTestCase
{
//...

public function testValidate()
{
$country = new Country();
$country->setCode('IS');

$contact = new Contact();
$contact->setCountry($country);

$validator = Validation::createValidatorBuilder()->getValidator();

$errors = $validator->validate($contact);

$this->assertEquals(1, count($errors));
}

此测试返回计数为 0 的 $errors 但它应该为 1,因为国家代码“IS”无效。

最佳答案

第一个问题是关于yml文件中约束的定义:你需要把callbackconstraint 部分而不是 properties 下,因此更改 validation.yml 文件如下:

验证.yml

AppBundle\Entity\Contact:
constraints:
- Callback:
callback: [ AppBundle\Entity\Contact, validate ]
groups: [ "AppBundle" ]

第二个 在测试用例中:您需要从容器中获取验证器服务,而不是使用构建器创建一个新服务:此对象未使用对象结构等进行初始化。

第三 回调约束仅为AppBundle 验证组定义,因此将验证组传递给验证器服务(作为服务的第三个参数)。

所以改变测试类如下:

    public function testValidate()
{
$country = new Country();
$country->setCode('IS');

$contact = new Contact();
$contact->setCountry($country);

// $validator = Validation::createValidatorBuilder()->getValidator();
$validator = $this->createClient()->getContainer()->get('validator');

$errors = $validator->validate($contact, null, ['AppBundle']);
$this->assertEquals(1, count($errors));
}

然后测试用例变成了绿色。

希望对你有帮助

关于validation - 单元测试 Symfony 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40436647/

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