这作为隐式参数 - 找不到参数的隐含值

时间:2015-10-18 20:47:25

标签: scala implicit scalatest

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

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

然后我有一个Page对象,其方法带有imp WebBrowser参数:

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

然后我想从实际规范中调用login方法。当spec类通过其WebBrowser超类实现BaseSpec特征时,我希望调用该方法的spec实例被解析为隐式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参数值,还是有更好的方法?

2 个答案:

答案 0 :(得分:2)

  

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

this不能自动隐式显示,但您可以轻松添加它:

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

答案 1 :(得分:1)

在此代码中创建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
  }
}

这个编译,并且工作得很好。