2016-03-02 2 views
1

Я использую акровую систему Akka с Spray и WireMock для создания веб-сервисов. Я хочу также проверить, что внешний HTTP-запрос уже сделан.Испытание асинхронного поведения с использованием WireMock

В следующем случае использования запроса POST производится на мой Spray сервер, который должен отправить запрос на внешнее обслуживание:

stubFor(get(urlEqualTo("/external-service")) 
    .willReturn(aResponse() 
     .withStatus(200) 
     .withBodyFile("response-body.json"))); 

myService ! Post("/my-service", FormData(Seq("id" -> "1"))) 

Thread.sleep(1000) 

verify(postRequestedFor(urlEqualTo("/services/harvesterService"))) 

В различных примерах, которые я видел технику Thread.sleep, так как в противном случае ActorSystem отключается, и моя служба никогда не сделает HTTP-запрос для внешней службы.

Можно ли избежать этого? Может ли WireMock ждать запроса к внешней службе? Возможно, с некоторым таймаутом ...

ответ

1

ПРИМЕЧАНИЕ. Предполагается, что ваш актер фактически отправляет HTTP-вызов, когда он получает это сообщение. Если вы хотите напрямую проверить маршруты спрей, я бы предложил вам посмотреть на http://spray.io/documentation/1.2.3/spray-testkit/, который является стандартным способом тестирования маршрутов распыления.

Обычно я использую ScalaTest вместе с Akka/Spray TestKit и использую функцию eventually. eventually позволяет вам повторно проверять состояние, которое в конечном итоге произойдет. Если вы поймаете исключение, вызванное методом verify, вы можете утверждать, что сообщение действительно отправлено или нет. Вы можете использовать что-то вроде

def postHasBeenSent(url: String): Boolean = 
    try { 
    verify(postRequestedFor(urlEqualTo(url))) 
    true 
    } catch { 
    case e: VerificationException => false 
    } 

(вы также можете использовать Try монады, если вы хотите, но это не точка здесь!)

, а затем в тесте (при условии, что вы используете matchers):

myService ! Post("/my-service", FormData(Seq("id" -> "1"))) 

eventually { 
    postHasBeenSent("/my-service") shouldBe true 
} 

Вы можете узнать больше о eventually и все вкусности, которые приходят с ней (для интервалов пример опроса) на http://doc.scalatest.org/2.2.6/index.html#org.scalatest.concurrent.Eventually

Смежные вопросы