Семантическая ошибка возникает при использовании только Behat


Привет сообществу StackOverflow, я только что присоединился к сообществу, и это мой первый вопрос:)

Я использую Symfony2. Когда я открываю страницу вручную с помощью своего браузера (firefox):

http://localhost:8000/vendor/add-product

Страница отображается нормально, и я вижу форму, которая позволит пользователю добавить товар в свой магазин.

Но когда я использую Behat для своих тестов, я получаю эту ошибку:

[Семантическая ошибка] Аннотация "@Symfony\Компонент\Валидатор\Ограничения\Большее значение" в свойство AppBundle\Сущность\Продукт::$ProductPrice не существует или не может быть загружено автоматически.

Это (часть) исходного кода, о котором идет речь:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
* @ORM\Entity
* @ORM\Table(name="app_products")
*/
class Product
{
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $productId;

    /**
    * @ORM\Column(type="integer")
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Store")
    */
    private $storeId;

    /**
    * @ORM\Column(type="string", length=255)
    * @Assert\NotBlank(message="This is important, Product Name should not be blank!")
    * @Assert\Length(max = "255", maxMessage="Your description must not exceed 255 characters.")
    */
    private $productName;

    /**
    * @ORM\Column(type="integer", length=255)
    * @Assert\GreaterThanOrEqual(value=0)
    * @Assert\NotBlank(message="Product Price should not be blank!")
    */
    private $productPrice;

    /**
    * @ORM\Column(type="string", length=255)
    * @Assert\NotBlank(message="Please enter a product description.")
    * @Assert\Length(max = "255", maxMessage="Your description must not exceed 255 characters.")
    */
    private $productDescription;

    /**
    * @ORM\Column(type="integer")
    * @Assert\GreaterThanOrEqual(value=0)
    * @Assert\NotBlank(message="Product Quantity should not be blank!")
    */
    private $productQuantity;

    /**
    * @ORM\Column(type="string", length=255)
    * @Assert\File(mimeTypes={ "image/jpeg" })
    * @Assert\File(maxSize="6000000")
    */
    private $productImage;
    ...

И это моя особенность:

Feature: Buying products
As a customer,
I want to view and select products before buying,
So that I could have more value for my money

Background:
    Given I am on the homepage
    When I fill in "username" with "24thsaint"
    And I fill in "password" with "123123"
    And I press "login-button"

Scenario: Vendor wants to add a new product
    Given I am on the homepage
    When I follow "My Store" ###### The test stops here as I get the Semantical Error
    And I follow "add-new-product"

Пожалуйста, помогите, я действительно думаю, что все на месте. Просто ошибка возникает во время тестирования с Behat. Что могло пойти не так?


Изменить:

Я выполнил предложения сэра Евгения Кузьмина, очистив кэш. Я ран,

php bin/console cache:clear --env=test

Тесты, которые проходили раньше, теперь завершаются с этой ошибкой:

[Semantical Error] The annotation "@Doctrine\ORM\Mapping\Entity" in 
class AppBundle\Entity\User does not exist, or could not be auto-loaded. 

Пожалуйста, помогите мне.

Author: Trix, 2016-03-02

2 answers

Когда вы получаете доступ к своей форме через локальный хост вручную, вы, скорее всего, используете dev env. Но когда Behat идет по тому же маршруту, он использует тестовую среду.

Поэтому сначала попробуйте очистить кэш с помощью опции "-e test"

Еще один момент - проверить ваш файл config_test.yml, возможно, вы переопределите опцию там

framework:
    validation: { enabled: true, enable_annotations: true } 
 0
Author: Evgeniy Kuzmin, 2016-03-03 14:53:29

Боже мой... После xx недель мучительного поиска решений в Интернете проблема этой ошибки возникла из-за неправильной конфигурации в:

Vendor/autoload.php

Когда я выполнил команду:

php composer.phar update

Это переписало мой vendor/autoload.php к этому:

<?php
autoload.php @generated by Composer

require_once __DIR__ . '/composer' . '/autoload_real.php';

return ComposerAutoloaderInit130fb5116714b6c2da66a4b026258e89::getLoader();
?>

В то время как это должно быть так, чтобы заставить эти аннотации работать и избавиться от этой ошибки:

<?php

use Doctrine\Common\Annotations\AnnotationRegistry;

require_once dirname( __DIR__ ).'/vendor/composer/autoload_real.php';

$loader = ComposerAutoloaderInit130fb5116714b6c2da66a4b026258e89::getLoader();

AnnotationRegistry::registerFile( dirname( __DIR__ ).'/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php' );
AnnotationRegistry::registerLoader([$loader, 'loadClass']);

return $loader;

Обратите внимание на включение аннотации.


Это строка:

AnnotationRegistry::registerFile( dirname( __DIR__ ).'/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php' );

Устраняет эту ошибку:

[Semantical Error] The annotation "@Doctrine\ORM\Mapping\Entity" in class AppBundle\Entity\User does not exist, or could not be auto-loaded. 

После этого тесты работали нормально. Однако я использовал проверки и эту ошибку:

[Semantical Error] The annotation "@Symfony\Component\Validator\Constraints\GreaterThanOrEqual" in property AppBundle\Entity\Product::$productPrice does not exist, or could not be auto-loaded.

Было решено путем добавления этой строки:

AnnotationRegistry::registerLoader([$loader, 'loadClass']);
 0
Author: Rave Alroone, 2016-03-04 21:22:34