0

新しいタイプを開発しましたが、どうすればテストできるのかわかりません。注釈のアサートはロードされず、検証は呼び出されません。誰か助けてくれませんか?

class BarcodeType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->
            add('price');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Bundles\MyBundle\Form\Model\Barcode',
            'intention'  => 'enable_barcode',
        ));
    }

    public function getName()
    {
        return 'enable_barcode';
    }
}

フォームデータを保存するための次のモデルがあります。

namepspace Bundles\MyBundle\Form\Model;
class Barcode
{
    /**
     * @Assert\Range(
     *      min = "100",
     *      max = "100000",
     *      minMessage = "...",
     *      maxMessage = "..."
     * )
     */
    public $price;
}

このようなテストを開発しました。フォームは有効なデータを取得しませんでしたが、有効です。(アノテーションが適用されていないため)ValidatorExtensionを追加しようとしましたが、コンストラクターパラメーターを設定する方法がわかりません

    function test...()
    {
        $field = $this->factory->createNamed('name', 'barcode');
        $field->bind(
                array(
                    'price'         => 'hello',
        ));

        $data = $field->getData(); 

        $this->assertTrue($field->isValid()); // Must not be valid 

    }
4

3 に答える 3

1

フォームの単体テストが必要な理由がわかりません。あなたのエンティティの検証を単体テストし、予想される出力でコントローラーをカバーすることはできませんか? エンティティの検証のテスト中に、次のようなものを使用できます。

public function testIncorrectValuesOfUsernameWhileCallingValidation()
{
  $v =  \Symfony\Component\Validator\ValidatorFactory::buildDefault();
  $validator = $v->getValidator();

  $not_valid = array(
    'as', '1234567890_234567890_234567890_234567890_dadadwadwad231',
    "tab\t", "newline\n",
    "Iñtërnâtiônàlizætiøn hasn't happened to ", 'trśżź',
    'semicolon;', 'quote"', 'tick\'', 'backtick`', 'percent%', 'plus+', 'space ', 'mich @l'
  );    

  foreach ($not_valid as $key) {
    $violations = $validator->validatePropertyValue("\Brillante\SampleBundle\Entity\User", "username", $key);
    $this->assertGreaterThan(0, count($violations) ,"dissalow username to be ($key)");
  }

}

于 2012-10-31T18:17:41.847 に答える
1

機能テスト。app/console doctrine:generate:crud with routing=/ss/barcode で CRUD を生成し、maxMessage="Too high" を指定すると、次のことができます。

class BarcodeControllerTest extends WebTestCase
{
    public function testValidator()
    {
        $client = static::createClient();
        $crawler = $client->request('GET', '/ss/barcode/new');
        $this->assertTrue(200 === $client->getResponse()->getStatusCode());
        // Fill in the form and submit it
        $form = $crawler->selectButton('Create')->form(array(
            'ss_bundle_eavbundle_barcodetype[price]'  => '12',
        ));

        $client->submit($form);
        $crawler = $client->followRedirect();
        // Check data in the show view
        $this->assertTrue($crawler->filter('td:contains("12")')->count() > 0);

        // Edit the entity
        $crawler = $client->click($crawler->selectLink('Edit')->link());
        /* force validator response: */ 
        $form = $crawler->selectButton('Edit')->form(array(
            'ss_bundle_eavbundle_barcodetype[price]'  => '1002',
        ));

        $crawler = $client->submit($form);
        // Check the element contains the maxMessage:
        $this->assertTrue($crawler->filter('ul li:contains("Too high")')->count() > 0);

    }
}
于 2012-10-31T22:24:14.613 に答える
-1

この行をインクルードする必要があり、モデルのようにインクルードしてから試してください。

/* Include the required validators */
use Symfony\Component\Validator\Constraints as Assert;

namespace Bundles\MyBundle\Form\Model;
class Barcode
{
    /**
     * @Assert\Range(
     *      min = "100",
     *      max = "100000",
     *      minMessage = "min message here",
     *      maxMessage = "max message here"
     * )
     */
    public $price;
}
于 2012-10-31T13:58:44.333 に答える