这是prior question的延续,我在回答中看到我对FakeApplication中插件的使用存在误解。
首先,我创建了一个作为特征的模型和一个实现它的对象。
trait UserModel extends ModelCompanion[User, ObjectId] {
// ...
}
object User extends UserModel
接下来,我有一个Controller,它是一个接收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 mock创建了一个UsersController Stub:
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 ...
}
}
}
所以我的问题是:在调用“/ hello”URL时,如何在FakeApplication中使用UserControllersTest而不是真正的UserControllers实现,在routeAndCall()中调用?
答案 0 :(得分:0)
您可能希望测试应用程序的两个不同部分:
当您测试控制器本身时,通常会创建一个请求并直接将其传递给控制器方法,该方法将生成答案。然后,您可以对答案进行一些验证,以验证测试结果。
当您测试路由器时,您要测试的是请求被路由到正确的控制器方法:您直接调用该URL并检查结果是否是您期望从控制器获得的结果。
你要做的事对我来说没有多大意义:
如果在路线/你好我有一个虚拟控制器,我的帖子就会到达路线 / hello是否正常工作?
由于路径文件被编译成实际用作路由器的Scala类,如果(并且我不确定)这样的动态路由功能在游戏中可用,则必须: