1

这是先前问题的延续,在该问题中我看到我对在 FakeApplication 中使用插件有误解。

首先,我有一个作为特征创建的模型和一个实现它的对象。

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

object User extends UserModel

接下来,我有一个控制器,它被创建为一个接收 UserModel 实例的抽象类,以及它各自使用 User 对象的实现。

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)

在测试目录中,我使用 UserModel 模拟创建了一个 UsersController 存根:

package controllers

import org.specs2.mock.Mockito

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

现在我有我的 UsersControllers Spec 测试:

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 实现?

4

1 回答 1

0

您可能想要测试应用程序的两个不同部分:

  • 控制器本身
  • http路由器

当您测试控制器本身时,您通常会创建一个请求并将其直接传递给控制器​​方法,该方法将生成答案。然后,您对答案进行一些验证以验证测试结果。

当您测试路由器时,您要测试的是请求是否被路由到正确的控制器方法:您直接调用 url 并检查结果是否是您期望的控制器的结果。

您尝试做的事情对我来说没有多大意义:

如果在路由 /hello 我有一个 dummyController,我发到路由 /hello 的帖子会正常工作吗?

由于路由文件被编译成一个实际上作为路由器工作的 Scala 类,如果(我不确定)这样的动态路由功能可用,您将不得不:

  • 删除 /hello 路径上的现有路由
  • 将新路由点添加到不同的控制器
于 2012-11-09T14:57:51.717 回答