2012-11-09 147 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,我的岗位路线 /你好正常工作?

由于路由文件编译成实际工作作为一个路由器,如果斯卡拉类(我不知道)这样的动态路由功能在游戏可用,你必须:

  • 删除/你好路径
  • 对现有路线的新路线点添加到不同的控制器
相关问题