這是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實現?