Сценарий: изменение и сохранение неполного изменения в кампании
Given I click on the Campaign section folder And I press Save in the selected Campaign Then I should see an error balloon informing the changes cannot be saved
Дело в том, что этот «шарик с ошибкой» на последнем шаге представляет собой вызов ajax, который затем приведет к зеленому или красному воздушному шару в соответствии с успехом операции. В настоящее время то, что я делаю, это «И я нажимаю« Сохранить »… Я буду спать (3), чтобы дать время для появления этого шара. Это не кажется очень умным, потому что вы тратите время, а также потому, что иногда это может занять более или менее время для обработки этого звонка.
Как вы, ребята, делаете ваши тесты поведения, ожидая, когда Ajax будет сделан, вместо того, чтобы просто помещать зверей в сон?
большое спасибо за любые отзывы!
Это делается, ожидая, когда ваши выдающиеся призывы ajax достигнут 0. jQuery.active проверит только это для вас.
В вашем FeatureContext.php вы можете сделать что-то вроде:
public function iShouldSeeAnErrorBalloon($title) { $time = 5000; // time should be in milliseconds $this->getSession()->wait($time, '(0 === jQuery.active)'); // asserts below }
И убедитесь, что вы используете драйвер Mink, который запускает javascript и ajax (по умолчанию это не так).
Если вы используете Prototypejs (например, Magento), эквивалентный код:
public function iShouldSeeAnErrorBalloon($title) { $this->getSession()->wait($duration, '(0 === Ajax.activeRequestCount)'); // asserts below }
Я делаю это, ожидая, когда DOM изменится в результате вызова Ajax. Я создал подкласс DocumentElement, назвав его AsyncDocumentElement и переопределив метод findAll:
public function findAll($selector, $locator, $waitms=5000) { $xpath = $this->getSession()->getSelectorsHandler()->selectorToXpath($selector, $locator); // add parent xpath before element selector if (0 === strpos($xpath, '/')) { $xpath = $this->getXpath().$xpath; } else { $xpath = $this->getXpath().'/'.$xpath; } $page = $this->getSession()->getPage(); // my code to wait until the xpath expression provides an element if ($waitms && !($this->getSession()->getDriver() instanceof \Behat\Symfony2Extension\Driver\KernelDriver)) { $templ = 'document.evaluate("%s", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ).snapshotLength > 0;'; $waitJs = sprintf($templ, $xpath); $this->getSession()->wait($waitms, $waitJs); } return $this->getSession()->getDriver()->find($xpath); }
Затем в \ Behat \ Mink \ Session я сменил конструктор на использование этого класса.
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null) { $driver->setSession($this); if (null === $selectorsHandler) { $selectorsHandler = new SelectorsHandler(); } $this->driver = $driver; $this->page = new AsyncDocumentElement($this); $this->selectorsHandler = $selectorsHandler; }
функцииpublic function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null) { $driver->setSession($this); if (null === $selectorsHandler) { $selectorsHandler = new SelectorsHandler(); } $this->driver = $driver; $this->page = new AsyncDocumentElement($this); $this->selectorsHandler = $selectorsHandler; }
Как только я это сделал, я обнаружил, что мои тесты AngularJS работают. До сих пор я тестировал только в Firefox.