Scala 此为隐式参数-找不到参数的隐式值

Scala 此为隐式参数-找不到参数的隐式值,scala,implicit,scalatest,Scala,Implicit,Scalatest,我一直试图在Selenium ScalaTest规范中将WebBrowser作为隐式参数传递,但失败了。我有一个用于所有测试的基本超类: abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers { implicit val webDriver: WebDriver = new FirefoxDriver } 然后我有一个页面对象,它有一个implictWebBrowser参数的方法: objec

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

abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
  implicit val webDriver: WebDriver = new FirefoxDriver
}
然后我有一个页面对象,它有一个implict
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

联机登录页面登录(“错误的用户名”、“错误的密码”)


我是否总是需要显式地提供
作为
WebBrowser
参数值,还是有更好的方法?

类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
  }
}

这可以编译并正常工作。

类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
  }
}

这可以编译并正常工作。

类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
  }
}

这可以编译并正常工作。

类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
  }
}
这可以编译,并且工作正常

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

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

abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
  implicit def webBrowser: WebBrowser = this
  implicit val webDriver: WebDriver = new FirefoxDriver
}
由于spec类通过其BaseSpec超类实现WebBrowser特性,我希望调用该方法的spec实例被解析为隐式WebBrowser

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

abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
  implicit def webBrowser: WebBrowser = this
  implicit val webDriver: WebDriver = new FirefoxDriver
}
由于spec类通过其BaseSpec超类实现WebBrowser特性,我希望调用该方法的spec实例被解析为隐式WebBrowser

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

abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
  implicit def webBrowser: WebBrowser = this
  implicit val webDriver: WebDriver = new FirefoxDriver
}
由于spec类通过其BaseSpec超类实现WebBrowser特性,我希望调用该方法的spec实例被解析为隐式WebBrowser

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

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