代码之家  ›  专栏  ›  技术社区  ›  agusgambina

使用Playframework 2.6 Macwire设置和测试编译时依赖项注入

  •  0
  • agusgambina  · 技术社区  · 7 年前

    在我的项目中,我有这样的结构

    app/
      --> common/
        --> DefyProductsComponents
        --> DefyProductsLoader
      --> controllers/
        --> HomeController
    

    Defyproducts组件

      package common
    
      import com.softwaremill.macwire.wire
      import controllers.{Assets, AssetsComponents, HomeController}
      import play.api.ApplicationLoader.Context
      import play.api.BuiltInComponentsFromContext
      import play.api.routing.Router
      import play.filters.HttpFiltersComponents
      import router.Routes
    
      import scala.concurrent.Future
    
      class DefyProductsComponents(context: Context)
        extends BuiltInComponentsFromContext(context)
          with HttpFiltersComponents
          with AssetsComponents {
    
        // Controllers
        lazy val homeController = wire[HomeController]
    
        // Router
        override lazy val assets = wire[Assets]
        lazy val prefix: String = "/"
        lazy val defyProductsRouter: Router = wire[Routes]
        lazy val router: Router = defyProductsRouter
    
      }
    

    反产品装载机

    package common
    
    import play.api._
    import play.api.ApplicationLoader.Context
    
    class DefyProductsLoader extends ApplicationLoader {
    
      override def load(context: Context): Application = {
        LoggerConfigurator(context.environment.classLoader).foreach { _.configure(context.environment) }
        new DefyProductsComponents(context).application
      }
    
    }
    

    家庭控制器

    package controllers
    
    import play.api.mvc._
    
    class HomeController (val controllerComponents: ControllerComponents) extends BaseController {
    
      def index() = Action { implicit request: Request[AnyContent] =>
        Ok(views.html.index("Welcome to Play"))
      }
    }
    

    我想设置测试测试,这是 test/ 结构

    test/
      --> common/
        --> DefyProductsServerTest
      --> controllers
        --> HomeControllerSpec
    

    反产品服务器测试

    package common
    
    import org.scalatestplus.play.PlaySpec
    import org.scalatestplus.play.components.OneAppPerTestWithComponents
    import play.api.{BuiltInComponents, NoHttpFiltersComponents}
    
    class DefyProductsServerTest extends PlaySpec with OneAppPerTestWithComponents {
    
      override def components: BuiltInComponents = new DefyProductsComponents(context) with NoHttpFiltersComponents {
    
      }
    
    }
    

    家庭控制器规范

    package controllers
    
    import common.DefyProductsServerTest
    import play.api.test._
    import play.api.test.Helpers._
    
    class HomeControllerSpec extends DefyProductsServerTest {
    
      "HomeController GET" should {
    
        "render the index page from the application" in {
          val home = homeController.index().apply(FakeRequest(GET, "/"))
    
          status(home) mustBe OK
          contentType(home) mustBe Some("text/html")
          contentAsString(home) must include ("Welcome to Play")
        }
    
        "render the index page from the router" in {
          val request = FakeRequest(GET, "/")
          val home = route(app, request).get
    
          status(home) mustBe OK
          contentType(home) mustBe Some("text/html")
          contentAsString(home) must include ("Welcome to Play")
        }
      }
    }
    

    我写的这个设置不起作用,我不知道为什么 HomeControllerSpec 找不到homeController。我知道在测试中,所有组件 DefyProductsComponents 可用,我可以覆盖


    更新:我在github中创建了一个非常类似的项目。以防万一有人想玩它 https://github.com/agusgambina/play-scala-base.git

    1 回复  |  直到 7 年前
        1
  •  1
  •   Frederic A.    7 年前

    最简单的方法是:

    在里面 DefyProductsServerTest 改变 components 进入:

    override def components: DefyProductsComponents = ...
    

    然后在测试中,您应该能够做到:

    val home = new components.homeController.index().apply(FakeRequest(GET, "/"))