Playframewrk v2.1 में एक fix for the integrated approach to this नहीं है जब तक यह विलय हो गया और जारी किया जाता है मैं एक backport of the fix on the 2.0.x branch
है, यहाँ है मैंने क्या किया (यह Play 2.0.3+ पर काम करता है):
मैंने अपने स्वयं के हेल्पर्स ऑब्जेक्ट को ऐसे libs पैकेज में परिभाषित किया है।
package libs
import play.api.mvc._
import play.api.libs.iteratee._
import play.api.libs.concurrent._
import play.api.test._
object Helpers {
def routeAndCall[T](request: FakeRequest[T]): Option[Result] = {
routeAndCall(this.getClass.getClassLoader.loadClass("Routes").asInstanceOf[Class[play.core.Router.Routes]], request)
}
/**
* Use the Router to determine the Action to call for this request and executes it.
*/
def routeAndCall[T, ROUTER <: play.core.Router.Routes](router: Class[ROUTER], request: FakeRequest[T]): Option[play.api.mvc.Result] = {
val routes = router.getClassLoader.loadClass(router.getName + "$").getDeclaredField("MODULE$").get(null).asInstanceOf[play.core.Router.Routes]
routes.routes.lift(request).map {
case a: Action[_] =>
val action = a.asInstanceOf[Action[T]]
val parsedBody: Option[Either[play.api.mvc.Result, T]] = action.parser(request).fold(
(a, in) => Promise.pure(Some(a)),
k => Promise.pure(None),
(msg, in) => Promise.pure(None)
).await.get
parsedBody.map{resultOrT =>
resultOrT.right.toOption.map{innerBody =>
action(FakeRequest(request.method, request.uri, request.headers, innerBody))
}.getOrElse(resultOrT.left.get)
}.getOrElse(action(request))
}
}
}
फिर अपने परीक्षण में मैं अपने सहायकों और पूरे नाटक सहायकों संदर्भ आयात करते हैं, routeAndCall के अलावा:
import libs.Helpers._
import play.api.test.Helpers.{routeAndCall => _,_}
मैं तो (एक लगभग सेटअप करने के लिए मेरे एप्लिकेशन का उपयोग मैं एक आवेदन पत्र उपलब्ध कराने की जरूरत है। रहस्य के रूप में मैं जो एक हस्ताक्षरित कुकी पर आधारित सत्र में प्रमाणीकृत उपयोगकर्ता नाम)
def appWithSecret():Map[String,String]={
Map(("application.secret","the answer is 42 !"))
}
object emptyApp extends Around {
def around[T <% Result](t: => T) = {
running(FakeApplication(additionalConfiguration = inMemoryMongoDatabase("emptyApp")++appWithSecret())) {
User(new ObjectId, "Jane Doe", "[email protected]", "id1").save()
t // execute t inside a http session
}
}
}
यह मैं निम्नलिखित परीक्षण लिखने के लिए अनुमति देता है की दुकान:
"respond to the index Action" in emptyApp {
val request: FakeRequest[AnyContent] = FakeRequest(GET, "/expenses").withSession(("email", "[email protected]"))
val Some(result) = routeAndCall(request)
status(result) must equalTo(OK)
contentType(result) must beSome("application/json")
charset(result) must beSome("utf-8")
contentAsString(result) must contain("Hello Bob")
}
यह आपको सुरक्षित कोड का उपयोग करने की अनुमति देता है भले ही यह यूनिट परीक्षण न हो।