2015-06-22 11 views
10

Próbuję napisać przypadek testowy dla mojej aplikacji z akka-http. Jednym z testami jest podany poniżej:Test trasy Http w Akka: Żądanie nie zostało zakończone ani odrzucone w ciągu 1 sekundy.

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 
     } 
    } 
    } 
} 

Kiedy uruchamiam to, że działa poprawnie czasami, a czasami pojawia się błąd jak Request was neither completed nor rejected within 1 second. Dodałem Thread.sleep, aby teraz działało. Wiem, że to nie jest poprawne rozwiązanie. Czy ktoś mógłby mi powiedzieć, jak sprawić, aby test trwał dłużej niż 1 sekundę?

Odpowiedz

5

Poniższy pracuje dla mnie:

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

Wystarczy zdefiniować 'niejawny val timeout = RouteTestTimeout (2.seconds)' –

6

Można użyć „w końcu” dopasowywania w ScalaTest czekać na warunek, aby stać się prawdą:

eventually { status shouldBe OK } 

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

To powinno wystarczyć, jeśli Thread.Sleep ty wykomentowane powyższe poprawki rzeczy ty.

Jednak wygląda na to, że faktyczny błąd jest taki, że czas oczekiwania, którego używa funkcja RouteTest, jest zbyt krótki. Komunikat o błędzie "Żądanie nie zostało zakończone ani odrzucone w ciągu 1 sekundy." pochodzi z RouteTestResultComponent via akka.http.scaladsl.testkit.RouteTest.

Myślę, że Thread.sleep jest rozproszony. Domyślny limit czasu dla testów routingu wynosi 1 sekundę; patrz akka.http.scaladsl.testkit.RouteTestTimeout.default. W swoim kodzie podajesz 5-sekundowy niejawny limit czasu, ale myślę, że jest innego rodzaju. Spróbuj niejawnie udostępnić parametr RouteTestTimeout z dłuższym czasem oczekiwania.

+1

kładę to w moim klasy specyfikacji i nie zmienić czas: 'prywatne niejawny val timeout = RouteTestTimeout (10 sekundowa rozpiętość) '. – Lachlan

2

można po prostu zaktualizować config rozszerzają timeout

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