首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单元测试具有json解析器的播放控制器操作

单元测试具有json解析器的播放控制器操作
EN

Stack Overflow用户
提问于 2017-09-19 07:17:27
回答 3查看 1.2K关注 0票数 4

我有一个想要测试的控制器操作,但是我得到了下面的错误。我觉得我可能遗漏了一些小东西,但又不能完全弄清楚它是什么。我写了一些小代码来帮助说明这个问题。

在更多的上下文中,我希望能够为控制器提供模拟依赖项,这就是为什么我要完全接管它的实例化。

代码语言:javascript
运行
复制
java.lang.UnsupportedOperationException: NoMaterializer does not provide an ExecutionContext
[info]   at play.api.test.NoMaterializer$.executionContext(Helpers.scala:661)
[info]   at play.api.mvc.PlayBodyParsers.$anonfun$enforceMaxLength$1(BodyParsers.scala:866)
[info]   at akka.stream.impl.Compose.apply(TraversalBuilder.scala:164)
[info]   at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:488)
[info]   at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:424)
[info]   at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:415)
[info]   at akka.stream.scaladsl.RunnableGraph.run(Flow.scala:496)

下面是我为帮助说明这个问题而编写的控制器。

代码语言:javascript
运行
复制
case class Location(lat: Double, long: Double)

object Location {

  implicit val locationReads: Reads[Location] = (
    (JsPath \ "lat").read[Double](min(-90.0) keepAnd max(90.0)) and
      (JsPath \ "long").read[Double](min(-180.0) keepAnd max(180.0))
    ) (Location.apply _)
}

class HomeController @Inject()(
    cc: ControllerComponents,
    mat: Materializer
)(implicit val ec: ExecutionContext) extends AbstractController(cc) {


  def savePlace: Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
    val placeResult = request.body.validate[Location]
    placeResult.fold(
      errors => {
        BadRequest(Json.obj("status" -> "KO", "message" -> JsError.toJson(errors)))
      },
      place => {
        Ok(Json.obj("status" -> "OK", "message" -> "Location saved"))
      }
    )
  }
}

和测试代码

代码语言:javascript
运行
复制
class HomeControllerSpec extends PlaySpec with Injecting with Inside with GuiceOneAppPerSuite with BeforeAndAfterEach with Results with BeforeAndAfterAll {
  implicit lazy override val app: play.api.Application = new GuiceApplicationBuilder().configure().build()
  implicit lazy val materializer: Materializer = app.materializer
  implicit lazy val components = Helpers.stubControllerComponents()

  "savePlace" must {

    val api = new HomeController(components, mat = materializer)

    val payload = Json.obj(
      "location" -> Json.obj("lat" -> 51.235685, "lng" -> -1.309197)
    )

    "just demo" in {
      val request = FakeRequest(POST, "/location").withJsonBody(payload)

      val result = call(api.savePlace, request)
      status(result) mustBe UNAUTHORIZED
    }
  }
}

我使用的是play 2.6.3

EN

Stack Overflow用户

发布于 2020-03-30 21:19:48

在某些情况下,您不想(或不能)使用依赖注入。

错误来自于stubControllerComponents具有playBodyParsers: PlayBodyParsers = stubPlayBodyParsers(NoMaterializer),因此将上面的components = ...更改为:

代码语言:javascript
运行
复制
implicit lazy val components = Helpers.stubControllerComponents(
    playBodyParsers = stubPlayBodyParsers(materializer)
)
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46289476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档