簡體   English   中英

這作為隱式參數-找不到參數的隱式值

[英]this as implicit parameter - could not find implicit value for parameter

我一直在嘗試將WebBrowser作為Selenium ScalaTest Spec中的隱式參數傳遞,但是失敗。 對於所有測試,我都有一個基本的超類:

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

然后,我有一個Page Object,它的方法帶有隱式WebBrowser參數:

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

然后,我想從實際規格中調用login方法。 當spec類通過其BaseSpec超類實現WebBrowser特性時,我希望調用該方法的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參數值,還是有更好的方法?

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

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

這樣可以編譯,並且工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM