【问题标题】:Play/Scala injecting controller into testPlay/Scala 将控制器注入测试
【发布时间】:2016-02-21 15:01:24
【问题描述】:

所以根据 Play 2.4 文档 (https://playframework.com/documentation/2.4.x/ScalaTestingWithScalaTest#Unit-Testing-Controllers),控制器应该设置为这样的特征

trait ExampleController {
  this: Controller =>

  def index() = Action {
    Ok("ok")
  }
}

object ExampleController extends Controller with ExampleController

为了让测试像这样工作

class ExampleControllerSpec extends PlaySpec with Results {

  class TestController() extends Controller with ExampleController

  "Example Page#index" should {
    "should be valid" in {
        //test code
    }
  }
}

但是,我使用的是 Guice 依赖注入,根据 Play 2.4 文档 (https://playframework.com/documentation/2.4.x/ScalaDependencyInjection),我的控制器如下所示:

@Singleton
class ExampleController @Inject() (exampleService: IExampleService) extends Controller {
    def index() = Action {
        Ok("")
    }
}

由于控制器不再是一个特征,我不能像这样将它混合到测试中:with ExampleController,我该如何让上面的测试工作?

【问题讨论】:

    标签: scala playframework guice scalatest playframework-2.4


    【解决方案1】:

    您可以直接从 ExampleController 继承。你也可以去掉extends Controller,因为你的控制器已经继承了这个:

    class TestController(service: IExampleService) extends ExampleController(service)
    

    您可以找到更多关于使用 Play 和 Guice 进行测试的信息here

    【讨论】:

    • 谢谢。顺便说一句,知道如何将服务(即注入控制器)也注入到同一个测试中吗?
    • 我会模拟服务,例如:使用 ScalaMock。
    • 我不明白,创建一个类 TestController 并对其进行测试,而不是直接测试 ExampleController 有什么好处?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多