2012-04-01 13 views
5

से Zentasks नमूना ऐप का परीक्षण कैसे करें मैं Play 2.0, स्कैला संस्करण के साथ खेलता हूं। वर्तमान में, मैं Zentasks sample app का विश्लेषण करता हूं।Play 2.0

इस ऐप का एक हिस्सा प्रमाणीकरण तंत्र है जो ज्यादातर Secured विशेषता में शामिल है। मैं सोच रहा हूं कि मैं सुरक्षित कार्यों का परीक्षण कैसे कर सकता हूं, उदा। indexProjects controller से।

नहीं सुरक्षित कार्रवाई के लिए, मैं शायद कुछ की तरह

val result = controllers.Projects.index(FakeRequest()) 

एक कार्रवाई चलाने के लिए और उसके परिणाम पाने के लिए क्या चाहते हैं।

सुरक्षित कार्रवाई के मामले में मुझे क्या करना चाहिए?

अस्वीकरण: मैं स्कैला और प्ले दोनों के लिए बिल्कुल नया हूं, इसलिए सभी संकेत बहुत मूल्यवान हैं। धन्यवाद!

उत्तर

1

ठीक है, मैं कोई महान विशेषज्ञ नहीं हूं, लेकिन यहां एक विचार है।

trait InSecure trait extends Secured बनाएं जो सुरक्षित कार्यों को ओवरराइड करता है और हमेशा एक्सेस की अनुमति देता है। फिर आप अपने परीक्षण में object InSecureProjects extends Projects with InSecture बना सकते हैं, इसे केवल सुरक्षा जांच को ओवरराइड करना चाहिए और बिना किसी सुरक्षा के कार्यों को जांचना चाहिए।

अब Projects पर परीक्षण चलाने की बजाय, आप उन्हें InSecureProjects पर चलाएं। आप अन्य सुरक्षित नियंत्रकों के लिए बिल्कुल वही कर सकते हैं।

मैं इसे परीक्षण नहीं किया है, इसलिए मुझे पता है अगर यह काम करता है;)

2

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") 
    } 

यह आपको सुरक्षित कोड का उपयोग करने की अनुमति देता है भले ही यह यूनिट परीक्षण न हो।

संबंधित मुद्दे