Как да създадете доктринни записи с идентификатор с помощта на 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 и собственици на продукти. Ако смесим приспособленията за данни в процеса, QA и PO ще бъдат оставени настрана - person petekaner; 28.09.2015
comment
@petekaner, разбира се, това не е целта. Тук казвате как да извлечете данни (опитвате се да настроите идентификатори, нали?), а не как да ги посочите в сценарии. Нека помислим за последното нещо - person DonCallisto; 28.09.2015