2015-02-04 14 views
14

Sto lavorando su una specifica di prova semplice usando spray e non riesco a farlo compilare correttamente, non so se sono fare qualcosa di sbagliato. La mia versione di scala è 2.9.3 e spray 1.0.1 (l'aggiornamento di uno di essi non è un'opzione adatta). Ecco il codice della mia specifica di prova:Come posso correggere il valore implicito mancante per il parametro ta: TildeArrow in una specifica di prova

import org.specs2.mutable.Specification 
import spray.testkit.Specs2RouteTest 
import spray.http._ 
import akka.util.Duration 
import java.util.concurrent.TimeUnit 

import service.MyProxy 

abstract class MyTestSpec extends Specification with Specs2RouteTest with MyProxy{ 

    val duration = Duration(30, TimeUnit.SECONDS) 
    implicit val routeTestTimeout = RouteTestTimeout(duration) 

    "MyProxy" should { 

    "return a json for GET requests to the /api/getclass/classCode path for a regular request" in { 
     Get("/api/getclass/123/") ~> myRoutes~> check { 
     responseAs[String] must contain("classCode") 
     contentType === ContentTypes.`application/json` 
     } 
    } 

    } // end should... 
} //end class 

Ricevo questo errore quando eseguo il test.

[error] C:\Users\Desktop\Project\MyTestSpec.scala:23: could not find implicit value for parameter ta: MyProxySpec.this.TildeArrow[spray.routing.RequestContext,Unit] 
[error]  Get("/api/getclass/123/") ~> myRoutes~> check { 
[error]          ^
[error] one error found 
[error] (test:compile) Compilation failed 

Ho provato diverse soluzioni viste su altre domande e nulla sembra funzionare finora.

Spray.io: Can't compile test spec

how to make scalatest work with spraytestkit and HttpServiceActor

Basic Spray-Testkit usage to test a route does not work

https://groups.google.com/forum/#!topic/spray-user/H5hkXuDGWYQ

https://groups.google.com/forum/#!topic/spray-user/zFUJSVBPM5c

NOTA: Solo per la cronaca, non sto usando ScalaTest o scalache ck su questo. È puramente un test route [spray]. E MyProxy estende l'attore

+0

Questo http://stackoverflow.com/questions/27941358/spray-io-cant-compile-test-spec mi ha aiutato. – Tvaroh

risposta

1

Posso riprodurre esattamente lo stesso messaggio di errore con Scala 2.10 se myRoutes non è in realtà un percorso ma uno Directive[HNil].

Sto quindi indovinando che nel tuo servizio non previsto. Classe MyProxy il tuo percorso non è completo.

cioè

trait MyProxy extends HttpService { 
    val myRoutes = path("foo") 
} 

dà questo errore

trait MyProxy extends HttpService { 
    val myRoutes = path("foo") { 
    complete(StatusCodes.Accepted) 
} 
} 

non lo fa.

2

Lo ScalatestRouteTest fornisce già un ActorySystem implicito. Rimuovere il modificatore "implicito" "" dal metodo actorRefFactory e il test dovrebbe essere eseguito.

Spray.io: Can't compile test spec

3

Ho appena lottato con questo problema. Per cercare di capirlo, ho passato in rassegna la base di codice HTTP Akka, che è una giungla di impliciti. Il mio problema sembrava essere che senza le implicazioni secondarie giuste in atto, non era stata trovata l'istanza corretta TildeArrow. Se si guarda il codice, l'istanza TildeArrow desiderata è definita come implicit def injectIntoRoute nell'oggetto associato, che richiede un intero host di altri impliciti.

Suggerisco di scrivere il codice senza alcuno zucchero implicito.Questo dovrebbe meglio aiutare il compilatore vi darà un messaggio d'errore:

"MyProxy" should { 
    "return a json for GET requests to the /api/getclass/classCode path for a regular request" in { 
    val request = Get("/api/getclass/123/") 
    val requestWithRoutes = request.~>(myRoutes)(TildeArrow.injectIntoRoute) 
    requestWithRoutes.~>(check { 
     responseAs[String] must contain("classCode") 
     contentType === ContentTypes.`application/json` 
    }) 
    } 
} 

Credo che il problema è che, poiché non c'è nessuna istanza concreta della disposizione implicita, il compilatore sta cercando di soddisfare la risoluzione implicita con la abstract class TildeArrow, e l'abstract completamente non specificato type, ta.Out, non ha una definizione ~>. Nel mio caso specifico, mi mancava un implicito ExecutionContextExecutor, qualunque cosa significhi. UPDATE In realtà, ho esaminato ulteriormente e il problema era che avevo un implicit def ec: ExecutionContextExecutor dichiarato nel mio percorso tratto, ma trait RouteTest definisce il suo nome come executor, e così quando ho definito il mio per soddisfare l'implicito mancante, ho finito con due dello stesso implicito.

È un'API carina, ma la magia implicita è fuori controllo, IMO, soprattutto considerando quanto siano criptici i messaggi di errore.

1

per Akka http:

nel mio caso, che si riferiscono a akka-http-microservice

  • la implicit modificatore executionContext e anche bisogno di essere rimosso
  • e dovrebbe riordinare il tratto in questo modo: class ServiceSpec extends FlatSpec with Matchers with Service with ScalatestRouteTest