Akka Http Route Test: запрос не был ни завершен, ни отклонен в течение 1 секунды

Я пытаюсь написать тестовый пример для своего приложения с akka-http. Один из тестовых примеров приведен ниже:

import akka.http.scaladsl.model.headers.RawHeader
import akka.http.scaladsl.testkit.{ ScalatestRouteTest}
import com.reactore.common.core.{CommonCoreSystem, CommonActors, BootedCommonCoreSystem}
import scala.concurrent.duration._
import com.reactore.common.feature.referencedata.{DepartmentRepository, DepartmentService, DepartmentController, DepartmentRest}
import org.scalatest.concurrent.AsyncAssertions
import org.scalatest.time.Span
import org.scalatest.{WordSpec, Matchers}
import akka.http.scaladsl.model.StatusCodes._
/**
 * Created by krishna on 18/6/15.
 */


class DepartmentITTest extends WordSpec with Matchers with ScalatestRouteTest with CommonCoreSystem with CommonActors {
//  override val departmentRouter = system.actorOf(Props(classOf[DepartmentService], DepartmentRepository), Constants.DEPARTMENT_ROUTER_NAME)
  val deptRoute = (new DepartmentRest(departmentRouter)(DepartmentController).deptRoutes)
  implicit val timeout = AsyncAssertions.timeout(Span.convertDurationToSpan(5.second))
  val departmentJson = """{"id":13,"name":"ENGP22","shortCode":"ENGP2","parentDepartmentId":null,"mineId":null,"photoName":null,"isRemoved":false,"isPendingForApproval":false,"createdBy":0,"createDate":"2015-03-09 00:00:00","modifiedBy":0,"modifiedDate":"2015-03-09 00:00:00"}"""
  val header = RawHeader("apiKey", "xxxxx")
  "Service" should  {
    "return department by id" in {
      Get("/departments/13").withHeaders(header) ~> deptRoute ~> check {
//        Thread.sleep(500)
        status shouldBe OK
        responseAs[String] shouldBe departmentJson
      }
    }
  }
}

Когда я запускаю это, он иногда работает правильно, а иногда я получаю сообщение об ошибке как Request was neither completed nor rejected within 1 second. Я добавил Thread.sleep, чтобы он работал. Я знаю, что это неправильное решение. Может ли кто-нибудь сказать мне, как заставить тест ждать более 1 секунды?


person Yadu Krishnan    schedule 22.06.2015    source источник


Ответы (3)


У меня работает следующее:

import akka.actor.ActorSystem
import scala.concurrent.duration._
import spray.testkit.ScalatestRouteTest

class RouteSpec extends ScalatestRouteTest {
  implicit def default(implicit system: ActorSystem) = RouteTestTimeout(2.second)
...
person practechal    schedule 23.09.2016
comment
Достаточно определить только implicit val timeout = RouteTestTimeout(2.seconds) - person Vladimir Korenev; 25.02.2017

Вы можете использовать сопоставление «в конечном итоге» в ScalaTest, чтобы дождаться выполнения условия:

eventually { status shouldBe OK }

http://www.artima.com/docs-scalatest-2.0.M5/org/scalatest/concurrent/Eventually.html

Этого должно быть достаточно, если Thread.sleep, который вы закомментировали выше, исправляет ситуацию за вас.

Однако мне кажется, что на самом деле ошибка заключается в том, что тайм-аут, который использует свойство RouteTest, слишком короткий. Сообщение об ошибке «Запрос не был ни завершен, ни отклонен в течение 1 секунды». поступает из RouteTestResultComponent через akka.http.scaladsl.testkit.RouteTest.

Я думаю, что Thread.sleep отвлекает. Тайм-аут по умолчанию для тестов маршрутизации составляет 1 секунду; см. akka.http.scaladsl.testkit.RouteTestTimeout.default. Вы указываете в своем коде неявный тайм-аут 5 секунд, но я думаю, что это другой тип. Попробуйте сделать RouteTestTimeout неявно доступным с более длительным таймаутом.

person Rich    schedule 17.08.2015
comment
Я поместил это в свой класс спецификации, и он изменил тайм-аут: private implicit val timeout = RouteTestTimeout(10 second span). - person Lachlan; 24.05.2016

вы можете просто обновить конфигурацию, чтобы увеличить время ожидания

akka {
  test {
    # factor by which to scale timeouts during tests, e.g. to account for shared
    # build system load
    timefactor =  3.0
  }
}
person Tony Z    schedule 01.03.2017