Scala 作为路由测试 - 必须定义 ActorRefFactory 上下文
Scala Akka Route Test - ActorRefFactory context must be defined
Akka Http 版本:“10.0.11”
我要测试以下路线:
private def getAll: Route = pathPrefix("_all") {
get {
complete((todoRegistryActor ? GetAllTodos).mapTo[Todos].map(todosToTodoDtos))
}
}
我有以下测试:
class TodoRouteSpec extends WordSpec with Matchers
with ScalatestRouteTest with RouteManager with BeforeAndAfterAll with TestKitBase with ImplicitSender {
override implicit val system: ActorSystem = ActorSystem("TodoRouteSpec")
override val executionContext: ExecutionContext = system.dispatcher
private val todoRegistryProbe = TestProbe()
override implicit val todoRegistryActor: ActorRef = todoRegistryProbe.ref
override def afterAll {
TestKit.shutdownActorSystem(system)
}
"The service" should {
"return a list of todos for GET _all request" in {
Get("/api/todo/_all").~>(todoRoute)(TildeArrow.injectIntoRoute).~>(check {
//todoRegistryProbe.expectMsg(GetAllTodos)
responseAs[TodosDto] shouldEqual TodosDto(Seq.empty)
status should ===(StatusCodes.OK)
})
}
}
}
当运行进行以下测试时,我收到错误:
异常或错误导致 运行 中止:必须定义 ActorRefFactory 上下文
java.lang.IllegalArgumentException:必须定义 ActorRefFactory 上下文
- 我正在寻找引发此错误的原因,但找不到解决方案。
有人知道是什么引起了这个错误吗?
- TildeArrow.injectIntoRoute 必须显式通过才能获得测试 运行。在这里找到解决方案:How can I fix the missing implicit value for parameter ta: TildeArrow in a test spec。也许有人知道另一种解决方案?
提前致谢
解决方案
class TodoRouteSpec extends WordSpec with Matchers with ScalatestRouteTest with TodoRoute {
private lazy val routes = todoRoute
private val todoRegistryProbe = TestProbe()
todoRegistryProbe.setAutoPilot((sender: ActorRef, _: Any) => {
sender ! Todos(Seq.empty)
TestActor.KeepRunning
})
override implicit val todoRegistryActor: ActorRef = todoRegistryProbe.ref
"TodoRoute" should {
"return a list of todos for GET /todo/_all request" in {
Get("/todo/_all").~>(routes)(TildeArrow.injectIntoRoute).~>(check {
todoRegistryProbe.expectMsg(GetAllTodos)
status should ===(StatusCodes.OK)
contentType should ===(ContentTypes.`application/json`)
entityAs[TodosDto] shouldEqual TodosDto(Seq.empty)
})
}
}
}
您不需要 actor 系统来进行路由测试。
参见 documentation 中的示例。
class FullTestKitExampleSpec extends WordSpec with Matchers with ScalatestRouteTest {
val smallRoute =
get {
path("ping") {
complete("PONG!")
}
}
"The service" should {
"return a 'PONG!' response for GET requests to /ping" in {
// tests:
Get("/ping") ~> smallRoute ~> check {
responseAs[String] shouldEqual "PONG!"
}
}
}
}
Akka Http 版本:“10.0.11”
我要测试以下路线:
private def getAll: Route = pathPrefix("_all") {
get {
complete((todoRegistryActor ? GetAllTodos).mapTo[Todos].map(todosToTodoDtos))
}
}
我有以下测试:
class TodoRouteSpec extends WordSpec with Matchers
with ScalatestRouteTest with RouteManager with BeforeAndAfterAll with TestKitBase with ImplicitSender {
override implicit val system: ActorSystem = ActorSystem("TodoRouteSpec")
override val executionContext: ExecutionContext = system.dispatcher
private val todoRegistryProbe = TestProbe()
override implicit val todoRegistryActor: ActorRef = todoRegistryProbe.ref
override def afterAll {
TestKit.shutdownActorSystem(system)
}
"The service" should {
"return a list of todos for GET _all request" in {
Get("/api/todo/_all").~>(todoRoute)(TildeArrow.injectIntoRoute).~>(check {
//todoRegistryProbe.expectMsg(GetAllTodos)
responseAs[TodosDto] shouldEqual TodosDto(Seq.empty)
status should ===(StatusCodes.OK)
})
}
}
}
当运行进行以下测试时,我收到错误: 异常或错误导致 运行 中止:必须定义 ActorRefFactory 上下文 java.lang.IllegalArgumentException:必须定义 ActorRefFactory 上下文
- 我正在寻找引发此错误的原因,但找不到解决方案。 有人知道是什么引起了这个错误吗?
- TildeArrow.injectIntoRoute 必须显式通过才能获得测试 运行。在这里找到解决方案:How can I fix the missing implicit value for parameter ta: TildeArrow in a test spec。也许有人知道另一种解决方案?
提前致谢
解决方案
class TodoRouteSpec extends WordSpec with Matchers with ScalatestRouteTest with TodoRoute {
private lazy val routes = todoRoute
private val todoRegistryProbe = TestProbe()
todoRegistryProbe.setAutoPilot((sender: ActorRef, _: Any) => {
sender ! Todos(Seq.empty)
TestActor.KeepRunning
})
override implicit val todoRegistryActor: ActorRef = todoRegistryProbe.ref
"TodoRoute" should {
"return a list of todos for GET /todo/_all request" in {
Get("/todo/_all").~>(routes)(TildeArrow.injectIntoRoute).~>(check {
todoRegistryProbe.expectMsg(GetAllTodos)
status should ===(StatusCodes.OK)
contentType should ===(ContentTypes.`application/json`)
entityAs[TodosDto] shouldEqual TodosDto(Seq.empty)
})
}
}
}
您不需要 actor 系统来进行路由测试。
参见 documentation 中的示例。
class FullTestKitExampleSpec extends WordSpec with Matchers with ScalatestRouteTest {
val smallRoute =
get {
path("ping") {
complete("PONG!")
}
}
"The service" should {
"return a 'PONG!' response for GET requests to /ping" in {
// tests:
Get("/ping") ~> smallRoute ~> check {
responseAs[String] shouldEqual "PONG!"
}
}
}
}