Spray.io: Can't compile test spec
Asked Answered
D

1

10

I have the following service:

trait PingService extends MyHttpService {

val pingRoutes =
    path("ping") {
      get {
        complete("message" -> "pong")
      }
    }
}

MyHttpServiceis a custom class that extends HttpServiceand only contains utility methods.

This is the test spec:

import akka.actor.ActorRefFactory
import org.json4s.{DefaultFormats, Formats}
import org.scalatest.{FreeSpec, Matchers}
import spray.testkit.ScalatestRouteTest

class PingServiceSpec extends FreeSpec with PingService with ScalatestRouteTest with Matchers {

override implicit def actorRefFactory: ActorRefFactory = system

override implicit def json4sFormats: Formats = DefaultFormats

  "Ping service" - {
    "when calling GET /ping" - {
      "should return 'pong'" in {
        Get("/ping") ~> pingRoutes ~> check {
          status should equal(200)
          entity.asString should contain("pong")
        }
      }
    }
  }
}

Whenever I try to run the tests, I get the following error:

could not find implicit value for parameter ta: PingServiceSpec.this.TildeArrow[spray.routing.RequestContext,Unit]

 Get("/ping") ~> userRoutes ~> check {
              ^

Am I doing something stupid? Any kind of help will be appreciated!

EDIT: Although this might look like a dupe of this question, it's not.

The solution provided in that post it's not working.

Dacey answered 14/1, 2015 at 11:2 Comment(0)
I
20

The ScalatestRouteTest already provides an implicit ActorSystem. Remove the implicit modifier from your actorRefFactory method and the test should get executed.

Impressionable answered 14/1, 2015 at 12:34 Comment(3)
The above error arises as a consequence from an implicit ambiguity, because you have two implicit ActorRefFactory in scope. The one from the ScalatestRouteTest the PingServiceSpec is based on and the one declared explicitly as actorRefFactory.Impressionable
Thank you! But why exception mentions could not find implicit value for parameter ta (which is implicit ta: TildeArrow[A, B]) instead of actorRefFactory?Koumis
I think because the compiler currently doesn't tell us, see SI-6127 for more info.Impressionable

© 2022 - 2024 — McMap. All rights reserved.