Проверка маршрута Akka Http: запрос не был завершен и не отклонен в течение 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 секунды?
Ответы
Ответ 1
Для меня работает следующее:
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)
...
Ответ 2
Вы можете использовать "в конечном счете" в 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 неявно доступным с более длительным таймаутом.
Ответ 3
вы можете просто обновить конфигурацию, чтобы увеличить время ожидания
akka {
test {
# factor by which to scale timeouts during tests, e.g. to account for shared
# build system load
timefactor = 3.0
}
}