使用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" 修饰符,然后应该执行测试。

这为我的代码解决了这个问题