我在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")
        }
    }
}

我想做的是测试一个请求,但是 mock EmailChecker,因为它在某些数据库中进行了一些查找,而这并不是我在测试中要做的。

我看过一些有关如何在Scala中进行模拟的教程,但找不到任何可以解决我情况的东西。

任何显示如何完成我想做的事情的帮助/指针/教程都很棒。

我对这两个游戏都很陌生!和Scala ...

最佳答案

一种可能的解决方案:

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("[email protected]")
    }
}

我还想定义一个包含Real和Test隐式对象的对象,这些隐式对象分别提供服务(例如EmailChecker)的真实和 stub 版本,并根据是测试还是生产代码来导入它们。在这种情况下,您需要使emailChecker参数隐式。依赖注入(inject)的粗略类型。

10-07 15:48