scala - Play 2.0 中的 stub Controller

标签 scala testing mocking playframework-2.0 stub

我正在尝试遵循 Mock Objects in Play[2.0] 中的示例但不幸的是我没有成功。

我有一个使用 UserModel 的 UsersController。

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

接下来是抽象 Controller

abstract class UsersController extends Controller {

  val userModel: UserModel

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


  // Other methods

}

在路由文件中,我这样调用say Hello方法:

POST /hello controllers.Users.sayHello

在测试目录中,我使用 UserModel 模拟创建了 UsersController 的子类。

package controllers

import org.specs2.mock.Mockito

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

现在,主要部分。我按照前面提到的页面中的 Jacob Groundwater 示例创建了一个规范测试。在为 FakeApplication 添加参数时,我包含了对 UserControllersTest 的调用。

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

  }

}

但是,当我运行测试时,我收到了这条错误消息:

[info] Users.SayHello should
[error] ! Not process a empty String
[error]     PlayException: Cannot load plugin [Plugin [controllers.UserControllersTest] cannot been instantiated.] (Application.scala:171)
...
[error] play.api.Application.<init>(Application.scala:158)
[error] play.api.test.FakeApplication.<init>(Fakes.scala:141)
[error] controllers.UsersSayHelloSpec$$anonfun$1$$anonfun$apply$5.sendJson$1(UsersSayHelloSpec.scala:20)
[error] controllers.UsersSayHelloSpec$$anonfun$1$$anonfun$apply$5$$anonfun$apply$26.apply(UsersSayHelloSpec.scala:46)
[error] controllers.UsersSayHelloSpec$$anonfun$1$$anonfun$apply$5$$anonfun$apply$26.apply(UsersSayHelloSpec.scala:46)

其中 UsersSayHelloSpec.scala:20 指的是我调用运行方法的行。

所以我的问题是:我做错了什么?

最佳答案

我不确定您到底想做什么,但可以回答“我做错了什么?”这个问题是:

参数 'additionalPlugins' 用于附加 Play 插件,'controllers.UserControllersTest' 不是 Play 插件。这是一个 Controller 。

您可以在此处阅读有关 Play 2 插件的信息:http://www.objectify.be/wordpress/?p=464

您是否尝试过这些示例:http://www.playframework.org/documentation/2.0.4/ScalaFunctionalTest

关于scala - Play 2.0 中的 stub Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13284579/

相关文章:

coldfusion - 使用 MXUnit 模拟/ stub 组件

使用 new Date() 作为当前日期的 Java 单元测试方法

Python 如何在导入包时模拟 ImportError

Scala pipelines - 用于构建 DAG 工作流程的 DSL

debugging - isapi 重写调试或测试工具

python - Django 和缓慢的迁移 : how to quickly get an empty database?

testing - 用于入站文件轮询的 Mule 测试代码

scala - 如何在 play 2.4 上安装 ReactiveMongo?

java - 尝试在 Java 中模仿 Scala 选项时出现问题

Scala 按多个字段排序