使用PlaySpec播放控制器功能测试

时间:2016-06-07 17:02:41

标签: scala testing playframework

我使用Play Scala 2.5,我想为控制器类编写功能测试。

这是我的控制器类的签名,其中包含我想要测试的操作。

class MyController @Inject()(implicit context: ExecutionContext, val messagesApi: MessagesApi, val dao: Dao) extends Controller with I18nSupport {

    def getMyData = Action.async { implicit request =>
        dao.getMyData map { myData => 
            Ok(views.html.render(myData))
        }.recover {
            // recover.
        }
    }
}

这是我的控制器动作中使用的Dao类:

import play.api.Configuration

class Dao @Inject()(val ws: WSClient, val configuration: Configuration) {

    val myConfigData: List[MyConfigData] = { ... }  // Get data from configuration

    def getMyData(): Future[List[MyData]] = {
        // use myConfigData and call web service (ws) to get some data
    }
}

我想在我的Dao课程中使用不同的配置测试我的控制器动作。 我设法做到这一点,我的测试类正在运行,但我想要一些改进代码的建议。

package controllers

import play.core.server.Server
import org.scalatest._
import Inspectors._
import org.scalatestplus.play._
import play.api.routing.sird._
import play.api.libs.json._
import play.api.mvc._
import play.api.Play
import play.api.test._
import play.api.i18n.MessagesApi
import play.api.Configuration
import play.api.test.Helpers.{ OK, status, contentAsString }
import org.scalatest.concurrent.ScalaFutures
import scala.concurrent.Future

import scala.concurrent.Await
import scala.concurrent.duration._

import play.api.libs.json._
import play.api.mvc._
import scala.concurrent.ExecutionContext
import com.typesafe.config.ConfigFactory
import dao.{ Dao }

import akka.util.Timeout

class MyControllerFunctionalSpec extends PlaySpec with OneAppPerSuite with ScalaFutures {

    implicit val messagesApi = app.injector.instanceOf[MessagesApi]
    implicit val ec = app.injector.instanceOf[ExecutionContext]
    implicit val timeout = Timeout(5 seconds)

    trait OneConfig {
        val config = ConfigFactory.parseString(""" my config """)
    }


    trait AnotherConfig {
        val config = ConfigFactory.parseString(""" my other config """)
    }

    "MyController" should {
        "get some data" in new OneConfig {
            Server.withRouter() {
                case GET(p"/url1/some/data") => Action {
                    Results.Ok(Json.arr(Json.obj("name" -> "data1")))
                }
            } { implicit port =>
                WsTestClient.withClient { client =>
                    implicit val dao = new Dao(client, Configuration(config))
                    val myController = new MyController()
                    val result = myController.getMyData(FakeRequest())
                    status(result) must equal(OK)
                    //println(contentAsString(result))
                }   
            }
        }
    }
}

它的工作方式与此类似,但我受到编译错误的指导,并通过修复它们来使其工作。

我希望得到帮助或建议以正确的方式做到这一点 欢迎任何建议。

0 个答案:

没有答案