【问题标题】:How to replace this pattern with a functional alternative?如何用功能替代品替换这种模式?
【发布时间】:2015-01-17 00:16:31
【问题描述】:

我在 Scala 中有以下模式:

object CurrentDriver {

  private var webDriver: WebDriver = null

  def invalidate = {
    webDriver.quit()
    webDriver = null
  }

  def getWebDriver = {
    if (webDriver==null)
      webDriver = DriverFactory.buildWebDriver
    webDriver
  }
}

它不起作用,它有一个 var,并且 invalidate 方法返回一个 Unit。需要单例对象,因为它由框架使用反射实例化的几个类引用,因此我无法将参数传递给它们。因此,他们需要调用 getWebDriver 来访问同一 WebDriver 实例。我需要定期(在每个由多个测试函数组成的测试场景之后)退出并重新创建一个新的 WebDriver,它由 invalidate 方法处理。

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    我建议使用around 块。

     object CurrentDriver {
          def around(f: WebDriver => Unit) = {
              val webDriver: WebDriver = DriverFactory.buildWebDriver
              f(webDriver) // your tests
              webDriver.quit()
          }
     }
    

    对于每个测试块,您可以将该块与around 函数结合使用。

    例如:

     def testFunc(webDriver: WebDriver) = around{ 
       assert(2 ==2)
       // do something with webDriver
    }
    

    【讨论】:

    • 这是一个很好的答案,但不能解决我的特定问题,因为我需要将同一个实例用于多个测试,这是我的错,因为我没有正确解决问题,我已经更新了描述。谢谢!
    • 我猜测试的签名将是相同的,也就是说,每个测试都不会接受任何东西并返回单元。在这种情况下,周围块的签名可以是函数列表而不是一个函数。 . 并且逻辑将保持不变......无论如何,有几个 vars 进行测试并不是那么糟糕:)
    • 我猜webDriver 实例也应该传递给f 函数,所以around 块中的代码可以访问它。
    猜你喜欢
    • 2021-06-16
    • 2019-08-26
    • 2013-07-30
    • 2010-11-30
    • 1970-01-01
    • 2016-06-09
    • 2020-04-11
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多