首页 > 解决方案 > 当类依赖于隐式时,是否有一种惯用的方式将类转换为对象?

问题描述

我是 Scala 的新手。

我有一系列执行 UI 测试的测试类,以及一系列包含可重用辅助方法的类。

示例测试类:

class MyCoolTestClass extends FreeSpec {

    //Note:  This driver needs to be configurable by the test in some way.
    implicit val driver:WebDriver = new ChromeDriver()

    val myCoolPage = new MyCoolPage

    //Tests below rely on myCoolPage methods
}

示例助手类:

class MyCoolPage(implicit driver:WebDriver) {
    def clickElement1(){
     //relies on driver
    }
    def assertElement2Enabled(){
     //relies on driver
    }
}

现在,没有一个助手类实际上具有可变状态。这让我想将它们从classes 转换为objects。

但是,我能弄清楚如何做到这一点的唯一方法是implicit WebDriver为每个方法添加一个参数。这行得通,但它很丑。有没有更简洁的方法可以在这里实现我想要的?或者,是否有一种更惯用的方式来完全组织这个测试类/辅助方法关系?

标签: scalasingletonimplicitscalatest

解决方案


可以implicit将帮助类更改为对象,并且仍然为成员方法提供值。

object MyCoolPage {

  private val driver :WebDriver = implicitly[WebDriver]

  def clickElement1() = ???          //relies on driver
  def assertElement2Enabled() = ???  //relies on driver
}

但是随后implicit声明必须移出测试类。我想到了两种可能性:WebDriver对象...

object WebDriver {
  implicit val wd :WebDriver = new ChromeDriver()
  ...

...或在专用对象中。

object MyCoolPage {
  import MyTestImplicits._
  private val driver :WebDriver = implicitly[WebDriver]
  ...

总而言之,我不相信这值得付出努力。


推荐阅读