【发布时间】:2019-06-01 03:11:18
【问题描述】:
这里是 Scala 菜鸟。
我不理解以下代码,取自 Play 应用程序的集成测试 (Scala):
package workflows.admin
import play.api.test._
class SignInSpec extends PlaySpecification {
"An activated user" should {
"be able to sign in to the admin console" in new WithBrowser(webDriver = WebDriverFactory(FIREFOX)) {
// some matchers here ...
true
}
}
}
据我了解,该示例从抽象类WithBrowser 创建了一个新的匿名类并将其实例化。该实例将接收(命名的)构造函数参数webDriver。
问题是我在查看WithBrowser 时不明白这里发生了什么:
abstract class WithBrowser[WEBDRIVER <: WebDriver](
val webDriver: WebDriver = WebDriverFactory(Helpers.HTMLUNIT),
val app: Application = GuiceApplicationBuilder().build(),
val port: Int = Helpers.testServerPort) extends Around with Scope {
def this(
webDriver: Class[WEBDRIVER],
app: Application,
port: Int) = this(WebDriverFactory(webDriver), app, port)
implicit def implicitApp: Application = app
implicit def implicitPort: Port = port
lazy val browser: TestBrowser = TestBrowser(webDriver, Some("http://localhost:" + port))
override def around[T: AsResult](t: => T): Result = {
try {
Helpers.running(TestServer(port, app))(AsResult.effectively(t))
} finally {
browser.quit()
}
}
}
我有两个问题:
-
WithBrowser是一个泛型抽象类,带有一个类型参数WEBDRIVER,但是示例中没有声明类型参数。相反,匿名类的实例使用命名构造函数参数webDriver接收此信息。类型参数和构造函数参数之间缺少什么联系? - 该示例声明了一个代码块(它只返回
true),这个代码块就是测试本身。但是该代码在匿名类中的什么位置?WithBrowser扩展了Around并覆盖了执行代码块的around函数,但我不明白生成的匿名类如何将给定的示例代码块移动到around。
非常感谢任何帮助。
【问题讨论】:
标签: scala playframework specs2