Pytanie Obsługa Async z Specflow dla Silverlight


Struktura testowa jednostki Silverlight definiuje proces obsługi wywołań asynchronicznych (wyprowadzenie klasy testowej z Microsoft.Silverlight.Testing.SilverlightTest, dodanie asynchronicznego atrybutu, użycie metod EnqueueXXX.) Rozważenie separacji, którą SpecFlow prezentuje między klasą testową a krokami:

  • Czy narzędzia te można wykorzystać do oczekiwania na wywołania metody Silverlight w ramach testu, które zachowują się asynchronicznie (na przykład wywoływanie usług sieciowych)?
  • Jeśli nie, jakie są wskazówki dotyczące postępowania w przypadku tego zachowania w plikach testowych SpecFlow? (Być może użyj AutoResetEvent, który zostanie wywołany w module obsługi zdarzeń i zaczekaj na niego?)

12
2017-08-02 03:47


pochodzenie




Odpowiedzi:


Używanie AutoResetEvent nie zadziała, ponieważ wywołanie WaitOne zablokuje wątek interfejsu użytkownika. Silverlight używa wątku UI nawet podczas wykonywania asynchronicznych połączeń z usługami danych (zobacz ten post - Thead jest blokowany za pomocą WebClient i ManualResetEvent), więc WaitOne rzeczywiście uniemożliwi wywołanie usługi.


3
2018-05-09 05:41





Wiem, że to jest prawdopodobnie za późno, ale tutaj idzie.

W przypadku połączeń asynchronicznych silverlight można użyć interfejsu API Specflow AsyncContext

https://github.com/techtalk/SpecFlow/wiki/Testing-Silverlight-Asynchronous-Code

Pisałem o tym na blogu, kiedy rozwijano go tutaj

http://rburnham.wordpress.com/2011/05/13/testing-silverlight-asynchronous-code-with-specflow/

Pomaga wyjaśnić tę koncepcję.


2
2018-01-17 22:48





Wydaje mi się, że każdy, kto przyjrzał się i wznowił to pytanie, czekał na kogoś, kto ma wspaniałą, elegancką odpowiedź, ale nie wygląda na to, że to się tutaj stanie. Aby pomóc innym, którzy potrzebują teraz użytecznej odpowiedzi ...

To, co zrobiłem w innych sytuacjach testowania jednostkowego, to użycie AutoResetEvent, o którym wspomniałeś w pytaniu:

AutoResetEvent MyAutoReset = new AutoResetEvent();
[TestMethod]
public void MyTestMethod()
{
   var MyItem.GetItem(x => 
      {
         // Return handler
         MyAutoReset.Set();
      });
   MyAutoReset.WaitOne(5000, false));
}

Oczywiście jest kilka rzeczy do rozważenia z tym podejściem, ale to wpada na pomysł.


1
2018-04-15 22:22



Dzięki za aktualizację Jason. Oczywiście minęło trochę czasu, odkąd zostało to pierwotnie opublikowane. Będę szczęśliwy, jeśli oznaczysz to jako odpowiedź, gdy będę mógł znaleźć czas na zastosowanie tego kodu do testu pochodzącego od SpecFlow. Zastanawiam się również, czy nowe Async CTP przyniesie cokolwiek na temat problemu. - avidgator