2012-11-08 18 views
0

我想从Mock Objects in Play[2.0]以下的例子,但不幸的是我没有成功。Play 2.0中的存根控制器

我有一个UsersController使用UserModel。

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

接下来,抽象控制器

abstract class UsersController extends Controller { 

    val userModel: UserModel 

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


    // Other methods 

} 

在routes文件,我把方法问好这样:

POST /你好controllers.Users.sayHello

在测试目录中,我使用UserMode创建了UsersController的子类我嘲笑。

package controllers 

import org.specs2.mock.Mockito 

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

现在,主要部分。我在之前提到的页面中按照Jacob Groundwater示例创建了一个Spec测试。在为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个referes到行,我调用运行方法。

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

回答

1

我不确定你到底想要做什么,但问题的答案是“我做错了什么?是:

参数'additionalPlugins'用于额外的Play插件,'controllers.UserControllersTest'不是Play插件。这是一个控制器。

你可以阅读在这里打球2个插件:http://www.objectify.be/wordpress/?p=464

你试过这些例子:http://www.playframework.org/documentation/2.0.4/ScalaFunctionalTest

+0

ygra:感谢澄清我对FakeApplication插件的误解。我重新在这里的问题:http://stackoverflow.com/questions/13302657/play-2-0-fakeapplication-calling-a-stub-controller-instead-real-one –