2012-11-09 146 views
1

這是prior question的繼續,其中的答案我看到我有一個關於在FakeApplication中使用插件的誤解。玩2.0:FakeApplication調用一個存根控制器,而不是真正的一個

首先我創建了一個模型作爲一個特質和一個暗示它的對象。

trait UserModel extends ModelCompanion[User, ObjectId] { 
// ... 
} 

object User extends UserModel 

接着,我有一個控制器,作爲接收的usermodel的實例,它使用用戶對象一個抽象類,和其相應的實施創建。

abstract class UsersController extends Controller { 

    val userModel: UserModel 

    def sayHello = Action(parse.json) { request => 
    // return a play Action. It doesn't use userModel 
    } 


    // Other methods 

} 

object Users extends UsersController(User) 

在test目錄,我創建了一個UsersController存根使用的usermodel模擬:

package controllers 

import org.specs2.mock.Mockito 

object UserControllersTest extends UsersController with Mockito { 
    val userModel = mock[models.UserModel] 
} 

現在,我有我的UsersControllers規格測試:

package controllers 

import org.specs2.mutable.Specification 

import play.api.libs.json.Json 
import play.api.test._ 
import play.api.test.Helpers._ 

class UsersSayHelloSpec extends Specification { 

    running(FakeApplication()) { 

    "Users.SayHello" should { 

     def sendJson(jsonMap: Map[String, String], shouldBeCorrect: Boolean) = { 
     running(new FakeApplication(
      additionalPlugins = Seq("controllers.UserControllersTest"))) { 
      // Preapration 
      val jsonRequisition = Json.toJson(jsonMap) 
      // *************************************** 
      // It will call UsersControllers.sayHello 
      val Some(result) = routeAndCall(FakeRequest(POST, 
       "/hello", 
       FakeHeaders(Map("Content-Type" -> Seq("application/json"))), 
       jsonRequisition)) 
      // *************************************** 


      // ... 
     } 
     } 

     "Not process a empty String" in { 
     sendJson(Map.empty[String, String], false) 
     } 

     // Other tests calling sendJson ... 
    } 

    } 

} 

所以我的問題是:如何能在調用routeAndCall()調用時調用「/ hello」URL時,我說FakeApplication使用UserControllersTest代替真正的UserControllers實現?

回答

0

有應用程序的兩個不同的部分,你可能想測試:

  • 控制器本身
  • 的HTTP路由器

當您測試控制器本身,您通常會創建一個請求,你直接將它傳遞給一個控制器方法,這將產生答案。然後,您執行一些驗證答案以驗證測試結果。

當您測試路由器時,您要測試的是請求被路由到正確的控制器方法:您直接調用url並檢查結果是您期望從控制器獲得的結果。

你正在嘗試做沒有多大意義,我:

如果對路線/你好,我有一個dummyController,我的崗位路線 /你好正常工作?

由於路由文件編譯成實際工作作爲一個路由器,如果斯卡拉類(我不知道)這樣的動態路由功能在遊戲可用,你必須:

  • 刪除/你好路徑
  • 對現有路線的新路線點添加到不同的控制器
相關問題