【问题标题】:this as implicit parameter - could not find implicit value for parameterthis 作为隐式参数 - 找不到参数的隐式值
【发布时间】:2016-01-17 03:08:36
【问题描述】:

我一直在尝试将 WebBrowser 作为 Selenium ScalaTest 规范中的隐式参数传递,但它失败了。我有一个用于所有测试的基础超类:

abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
  implicit val webDriver: WebDriver = new FirefoxDriver
}

然后我有一个页面对象,它有一个带有隐含 WebBrowser 参数的方法:

object LoginPage extends Page {
  def login(username: String, password: String) (implicit browser : WebBrowser ) = {      
    //...
  }

然后我想从实际规范中调用login 方法。由于规范类通过其BaseSpec 超类实现WebBrowser 特征,我希望调用该方法的规范实例被解析为隐式WebBrowser:

class LoginSpec extends BaseSpec {

  it("Should fail on invalid password") {
    LoginPage login("wrong username", "wrong password")
    assertIsOnLoginPage()
  }
}

但这失败并出现编译错误:

找不到参数浏览器的隐含值:org.scalatest.selenium.WebBrowser

在线LoginPage login("wrong username", "wrong password")

我是否总是需要明确提供this 作为WebBrowser 参数值,还是有更好的方法?

【问题讨论】:

标签: scala implicit scalatest


【解决方案1】:

由于规范类通过其 BaseSpec 超类实现 WebBrowser 特征,我希望调用该方法的规范实例被解析为隐式 WebBrowser

this 不能作为隐式自动使用,但您可以轻松添加它:

abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
  implicit def webBrowser: WebBrowser = this
  implicit val webDriver: WebDriver = new FirefoxDriver
}

【讨论】:

    【解决方案2】:

    class LoginSpec 中创建一个隐式 val,如下代码所示:

    trait WebBrowser
    class WebDriver
    class FunSpec
    trait ShouldMatchers
    class FirefoxDriver extends WebDriver
    
    abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
      implicit val webDriver: WebDriver = new FirefoxDriver
    }
    
    trait Page
    
    object LoginPage extends Page {
      def login(username: String, password: String)(implicit browser: WebBrowser) = {
        println(username, password)
      }
    }
    
    class LoginSpec extends BaseSpec {
      implicit val browser: WebBrowser = this
      def fun = {
        LoginPage login("wrong username", "wrong password")
      }
    }
    
    object ImplicitThis {
      def main(args: Array[String]) {
        new LoginSpec().fun
      }
    }
    

    这可以编译,并且工作正常。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 2011-10-17
      • 2016-03-31
      • 2015-01-27
      • 1970-01-01
      • 2016-02-27
      • 2016-02-22
      • 2011-04-15
      • 2015-06-28
      相关资源
      最近更新 更多