2013-08-03 65 views
0

我有一個小型Play(2.1.2)應用程序,它試圖存儲一些數據並執行重定向。我有2種規格:使用Specs2播放FakeRequest請求跨測試請求

"save the user" in { 
    running(FakeApplication()) { 
    val Some(create) = route(
     FakeRequest(PUT, "/users") 
     .withSession(("user-id", user_id)) 
     .withFormUrlEncodedBody(("username", any_username)) 
    ) 

    status(create) must equalTo(SEE_OTHER) 
    redirectLocation(create).map(_ must equalTo("/profile")) getOrElse failure("missing redirect location") 
    } 
} 

"display errors with missing username" in { 
    running(FakeApplication()) { 
    val Some(create) = route(
     FakeRequest(PUT, "/users") 
     .withSession(("user-id", user_id)) 
    ) 

    status(create) must equalTo(BAD_REQUEST) 
    contentAsString(create) must contain ("This field is required") 
    } 
} 

當運行這些測試中,第二測試具有相同的結果作爲第一個,所以一個SEE_OTHER代替BAD_REQUEST。當我改變測試的順序時,兩者都可以正常工作。第二個也通過,當我刪除第一個。

Scala/Play/Specs2在測試或請求中記住狀態嗎?有什麼我需要做,以確保他們孤立運行?

編輯:

在我的控制器中的代碼看起來是這樣的:

val form: Form[User] = Form(
    mapping(
    "username" -> nonEmptyText 
)(user => User(username))(user=> Some(user.username)) 
) 

form.bindFromRequest.fold(
    errors => BadRequest(views.html.signup(errors)), 
    user => Redirect("/profile") 
) 

回答

1

Playframework 2/Specs2不保留測試之間的狀態,除非你保持狀態,在你的測試類,應用程序或任何外部讓你保存數據。

例如,如果您的應用程序可讓用戶在一個測試和測試該用戶是否存在等保存到數據庫中的另一項測試,然後,當然,這將使彼此的干擾測試。

所以我猜你需要找出一些方法來清除您儲存每次測試之間數據的數據庫。

+0

我將我的控制器代碼,它似乎像'bindFromRequest'告訴我,雖然我已經指定了'nonEmptyText'爲'username'屬性的形式確定。 –

+0

感謝您指點我再次檢查我的數據庫內容的方向,確實在此測試中缺少插入語句。爲什麼刪除另一個測試修復它仍然是一個謎,但它現在的作品! –