我在Play应用程序中遇到了模拟问题。我的申请如下:
object Application extends Controller {
def login = Action {implicit request =>
val email = ... //Some email from the request
if(EmailChecker.checkEmail(email)) {
Ok("Email is checked and is fine")
} else {
Ok("Email is wrong")
}
}
}
我想要做的是测试一个请求但是嘲笑EmailChecker,因为它在某些数据库中进行了一些查找,这不是我想在测试中做的事情。
我已经看过一些关于如何在Scala中进行模拟的教程,但我找不到任何涵盖我的案例的内容。
任何显示如何做我想做的帮助/指针/教程都会很棒。
我对两个人来说都很新!和斯卡拉......
答案 0 :(得分:5)
一种可能的解决方案:
class Application(emailChecker: EmailChecker) extends Controller {
def login = Action {implicit request =>
val email = ... //Some email from the request
if(emailChecker.checkEmail(email)) {
Ok("Email is checked and is fine")
} else {
Ok("Email is wrong")
}
}
}
object Application extends Application(EmailChecker)
测试将是:
import org.specs2.Specification
import org.specs2.mock.Mockito
class ApplicationUnitSpec extends Specification with Mockito { def is =
"Test Application" ! {
val emailChecker = mock[EmailChecker]
val response = new Application(emailChecker).login(FakeRequest)
there was one(emailChecker).checkEmail("blah@example.com")
}
}
我还想定义一个包含Real和Test implicits的对象,它们分别提供像EmailChecker这样的服务的真实和存根版本,并根据它是测试代码还是prod代码导入它们。在这种情况下,您需要隐藏emailChecker参数。原始类型的依赖注入。