2015-02-04 2 views
14

Я работаю над простой тестовой спецификацией с использованием спрей, и я не могу заставить его правильно компилировать, не знаю, что-то не так. Моя версия scala - 2.9.3 и спрей 1.0.1 (Обновление любого из них не является подходящим вариантом). Вот мой тестовый код:Как исправить недостающее неявное значение параметра ta: TildeArrow в спецификации теста

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 

Я получаю эту ошибку, когда запускаю тест.

[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 

Я пробовал разные решения, рассматриваемые по другим вопросам, и пока ничего не работает.

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

ПРИМЕЧАНИЕ: Только для записи, я не использую scalatest или scalache ck на этом. Является чисто испытанием маршрута [распыления]. И MyProxy extends Actor

+0

Этот http://stackoverflow.com/questions/27941358/spray-io-cant-compile-test-spec помог мне. – Tvaroh

ответ

1

Я могу воспроизвести то же сообщение об ошибке с Scala 2.10, если myRoutes на самом деле не маршрут, а Directive[HNil].

Я поэтому предполагаю, что в вашем классе unshown service.MyProxy ваш маршрут не завершен.

т.е.

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

дает эту ошибку

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

нет.

2

ScalatestRouteTest уже предоставляет неявную систему ActorySystem. Удалите «неявный» модификатор из вашего метода actorRefFactory и тест должен быть выполнен.

Spray.io: Can't compile test spec

3

Я просто боролся с этой проблемой. Чтобы попытаться понять это, я пробрался через кодовую базу Akka HTTP, которая является джунглями implicits. Моя проблема заключалась в том, что без правильных вторичных имплицитов на месте не было найдено правильного экземпляра TildeArrow. Если вы посмотрите на код, то необходимый TildeArrow экземпляр, который требуется, определяется как implicit def injectIntoRoute в сопутствующем объекте, для которого требуется целый ряд других имплицитов.

Предлагаю написать код без какого-либо неявного сахара.Это должно лучше помочь компилятору дать вам правильное сообщение об ошибке:

"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` 
    }) 
    } 
} 

Я думаю, проблема в том, что, поскольку нет конкретного экземпляра неявных доступны, компилятор пытается удовлетворить неявное разрешение с abstract class TildeArrow, и полностью неопределенный реферат type, ta.Out, не имеет ~>. В моем конкретном случае мне не хватало неявного ExecutionContextExecutor, что бы это ни значило. ОБНОВЛЕНИЕ На самом деле, я заглянул в нее дальше, и проблема состояла в том, что у меня была implicit def ec: ExecutionContextExecutor, заявленная в моей дорожной характеристике, но trait RouteTest определяет ее имя как executor, и поэтому, когда я определил свою собственную, чтобы выполнить недостающее неявное, я закончил с два из них неявные.

Это симпатичный API, но неявное волшебство выходит из-под контроля, IMO, особенно учитывая, насколько загадочны сообщения об ошибках.

1

для AKKA Http:

в моем случае, которые относятся к akka-http-microservice

  • implicit модификатор executionContext, а также должны быть удалены
  • и должны реорганизовать черту так: class ServiceSpec extends FlatSpec with Matchers with Service with ScalatestRouteTest