[英]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.