2015-06-22 3 views
10

Я пытаюсь написать тестовый пример для своей заявки с akka-http. Один из testcases приводится ниже:Проверка маршрута Akka Http: запрос не был завершен и не отклонен в течение 1 секунды

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 секунды?

ответ

5

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

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

Достаточно определить только «неявный val timeout = RouteTestTimeout (2.seconds)» –

6

Вы можете использовать «в конечном счете» Искателя в 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 неявно доступным с более длинным таймаутом.

+1

Я поставил это в моем классе спецификации и это изменить тайм-аут: 'частное неявное значение val timeout = RouteTestTimeout (10-секундный интервал) '. – Lachlan

2

вы можете просто обновить конфигурации, чтобы расширить тайм-аут

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