2012-11-08 15 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 –