Как создать записи доктрины с идентификатором, используя Behat и tablenode в Symfony

У меня есть следующая особенность:

Scenario: Product page
    Given there are the following products:
      | id | name          | price |
      | 1 | Test product  | 100   |
    When I am on "/product/view/1"
    Then the main page title should be "Test product"

Теперь я использую Symfony с Doctrine. Итак, в моем классе контекста я не могу этого сделать:

/**
     * @Given /^there are the following products:$/
     */
    public function createProducts(TableNode $products)
    {

        $hash = $users->getHash();
        foreach ($hash as $row) {
            // Create our user and set details
            $product = new Product();
                        $product->setId($row['id']); // <= This method doesn't exist
            $product->setName($row['name']);
            $product->setPrice($row['price']);

            // Persist product...
        }
    }

Метода setId не существует, и создавать его не очень хорошая идея. Итак, мой вопрос: есть ли способ проверить это?


person petekaner    schedule 22.09.2015    source источник


Ответы (2)


Вы должны использовать другой подход:

Scenario: Product page
Given there are the following products:
  | name          | price |
  | Test product  | 100   |
When I am on the "Test product" page
Then the main page title should be "Test product"

Шаг I am on the "Test product" page должен быть таким:

    $product = $this->getService('your_product_repo')->findOneBy(array('name' => $productName));

    $url = $this->getService('router')->generate('your_product_page_route', array('id' => $product->getId()));

    $this->getSession()->visit($url);

Это может не работать из коробки, но это дает вам представление.

Таким образом, если вы когда-либо измените маршрут продукта, этот сценарий не пострадает.

person gvf    schedule 22.09.2015
comment
Привет, это хорошая идея. Проблема в том, что мы хотим иметь несколько тестов для проверки URL (вещи SEO). Таким образом, SEO может создавать тесты, чтобы убедиться, что, например, URL /product/view/323 выполняет перенаправление 301 на product-view/323. - person petekaner; 28.09.2015
comment
используйте тот же подход: когда я перехожу на страницу продукта, я должен быть на перенаправленной странице. Первый шаг сгенерирует «/product/view/323» и посетит его, второй шаг проверит, что текущий uri — это «product-view/323». - person gvf; 28.09.2015

Используйте DataFixtures для таких задач.

Вы можете легко создать тестовые данные и соответствующим образом заполнить тестовую базу данных.

person DonCallisto    schedule 24.09.2015
comment
Я хотел бы избежать использования фикстур данных, поскольку они на самом деле не относятся к тесту. Фикстуры данных великолепны, но весь смысл использования behat заключается в том, что файлы функций могут быть понятны разработчикам, тестировщикам и владельцам продуктов. Если мы смешаем фикстуры данных в процессе, QA и PO останутся в стороне. - person petekaner; 28.09.2015
comment
@petekaner конечно не в этом дело. Вы говорите здесь, как получить данные (вы пытаетесь настроить идентификаторы, не так ли?), а не как указывать их в сценариях. Давайте подумаем об этом последнем - person DonCallisto; 28.09.2015