2012-09-25 13 views
9

Scenariusz: Modyfikacja i zapisać niekompletny zmiany do kampaniiJak sprawić, by Behat czekał na połączenie AJAX?

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 

Chodzi o to, że ten „balon błąd” w końcowym etapie jest wywołanie ajax, które będą następnie doprowadzić zielony lub czerwony balon stosownie do sukcesu operacja. Obecnie to, co robię, to po "A ja naciskaję Zapisz ..." Zrobię spać (3), aby dać mu czas na pojawienie się tego balonu. To nie wydaje się być bardzo inteligentne, ponieważ marnujesz czas, a także dlatego, że czasami może upłynąć trochę czasu, zanim wywołanie to zostanie przetworzone.

Jak sprawić, aby testy behawioralne były oczekiwane, aby Ajax został zrobiony, a nie tylko uśpione zwierzęta?

dziękuję bardzo za wszelkie opinie!

+0

wyświetla kod? – StaticVariable

Odpowiedz

26

Odbywa się to przez czekanie na zaległe wywołania ajax do trafienia 0. jQuery.active sprawdzi to właśnie dla ciebie.

W pliku FeatureContext.php można zrobić coś takiego;

public function iShouldSeeAnErrorBalloon($title) 
{ 
    $time = 5000; // time should be in milliseconds 
    $this->getSession()->wait($time, '(0 === jQuery.active)'); 
    // asserts below 
} 

I upewnij się, że używasz sterownika Mink, który uruchamia javascript i ajax (domyślnie nie).

1

W przypadku korzystania Prototypejs (np Magento), odpowiednik kod jest:

public function iShouldSeeAnErrorBalloon($title) 
{ 
    $this->getSession()->wait($duration, '(0 === Ajax.activeRequestCount)'); 
    // asserts below 
} 
+1

Skąd pochodzi zmienna czasu trwania? –

+0

http://mink.behat.org/api/behat/mink/session.html#wait() 'public void wait (czas całkowity, stan ciągu) Czeka trochę czasu lub do momentu, gdy warunek JS stanie się prawdziwy." – Steff

+0

Po prostu aktualizuję ten link, ale jak już użyłem numerów linii, bez wątpienia wkrótce się to skończy: https://github.com/Behat/Mink/blob/master/src/Behat/Mink/Session.php # L318-L329 – DanielM

2

to zrobić przez czeka na DOM zmianie w wyniku Wezwania Ajax. Zrobiłem podklasę DocumentElement, nazywając go AsyncDocumentElement i przesłanianie metody 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); 
} 

Następnie w \ Behat \ Mink \ Session Zmieniłem konstruktora używać tej klasy.

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; 
} 

Kiedy to zrobiłem, stwierdziłem, że moje testy AngularJS działały. Do tej pory testowałem tylko w Firefoksie.

Powiązane problemy