5

我在 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 中模拟的教程,但我找不到任何涵盖我所拥有的案例的东西。

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

我对这两个游戏都很陌生!和斯卡拉...

4

1 回答 1

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 隐式的对象,它们分别提供诸如 EmailChecker 之类的服务的真实版本和存根版本,并根据它是测试代码还是产品代码来导入它们。在这种情况下,您需要将 emailChecker 参数设为隐式。一种粗略的依赖注入。

于 2012-09-25T18:41:56.000 回答