使用Scalatest测试Spray服务时,如何引入隐式值?
When testing Spray services with Scalatest, how to introduce implicit values?
我有一个服务:
trait MyService extends HttpService {
def getDao(implicit dao: SomeDAO) = dao
def someRoute = path("foo") {
get {
complete(getDao getSomething)
}
}
}
那么,我有一个演员:
class MyActor extends MyService with Actor {
override def receive: Receive = runRoute(someRoute)
def actorRefFactory: ActorRefFactory = context
}
我的测试 class 看起来像这样:
class MyServiceTest extends FlatSpec with ScalatestRouteTest with MyService with Matchers with MockFactory {
override implicit def actorRefFactory: ActorSystem = system
implicit val _dao: SomeDAO = mock[SomeDAO]
"My service" should "return something" in {
Get("/foo") ~> someRoute ~> check {
status should be(OK)
}
}
}
但是当我 运行 测试时,编译器抱怨找不到 SomeDAO
的隐式值。我如何设法让 SomeDAO
进入我的服务?我错过了什么/我做错了什么?
我认为你最好将 implicit
声明为 someRoute
,像这样:
trait MyService extends HttpService {
def someRoute(implicit dao: SomeDAO) = path("foo") {
get {
complete(dao getSomething)
}
}
}
它应该可以编译,并且拥有一个方法来检索隐式也更有意义。
ScalatestRouteTest 已经提供了一个隐式的 ActorySystem。从您的 actorRefFactory 方法中删除 "implicit" 修饰符,然后应该执行测试。
这为我的代码解决了这个问题
我有一个服务:
trait MyService extends HttpService {
def getDao(implicit dao: SomeDAO) = dao
def someRoute = path("foo") {
get {
complete(getDao getSomething)
}
}
}
那么,我有一个演员:
class MyActor extends MyService with Actor {
override def receive: Receive = runRoute(someRoute)
def actorRefFactory: ActorRefFactory = context
}
我的测试 class 看起来像这样:
class MyServiceTest extends FlatSpec with ScalatestRouteTest with MyService with Matchers with MockFactory {
override implicit def actorRefFactory: ActorSystem = system
implicit val _dao: SomeDAO = mock[SomeDAO]
"My service" should "return something" in {
Get("/foo") ~> someRoute ~> check {
status should be(OK)
}
}
}
但是当我 运行 测试时,编译器抱怨找不到 SomeDAO
的隐式值。我如何设法让 SomeDAO
进入我的服务?我错过了什么/我做错了什么?
我认为你最好将 implicit
声明为 someRoute
,像这样:
trait MyService extends HttpService {
def someRoute(implicit dao: SomeDAO) = path("foo") {
get {
complete(dao getSomething)
}
}
}
它应该可以编译,并且拥有一个方法来检索隐式也更有意义。
ScalatestRouteTest 已经提供了一个隐式的 ActorySystem。从您的 actorRefFactory 方法中删除 "implicit" 修饰符,然后应该执行测试。
这为我的代码解决了这个问题