scala - 当类依赖于隐式时,是否有一种惯用的方式将类转换为对象?
问题描述
我是 Scala 的新手。
我有一系列执行 UI 测试的测试类,以及一系列包含可重用辅助方法的类。
示例测试类:
class MyCoolTestClass extends FreeSpec {
//Note: This driver needs to be configurable by the test in some way.
implicit val driver:WebDriver = new ChromeDriver()
val myCoolPage = new MyCoolPage
//Tests below rely on myCoolPage methods
}
示例助手类:
class MyCoolPage(implicit driver:WebDriver) {
def clickElement1(){
//relies on driver
}
def assertElement2Enabled(){
//relies on driver
}
}
现在,没有一个助手类实际上具有可变状态。这让我想将它们从class
es 转换为object
s。
但是,我能弄清楚如何做到这一点的唯一方法是implicit WebDriver
为每个方法添加一个参数。这行得通,但它很丑。有没有更简洁的方法可以在这里实现我想要的?或者,是否有一种更惯用的方式来完全组织这个测试类/辅助方法关系?
解决方案
您可以implicit
将帮助类更改为对象,并且仍然为成员方法提供值。
object MyCoolPage {
private val driver :WebDriver = implicitly[WebDriver]
def clickElement1() = ??? //relies on driver
def assertElement2Enabled() = ??? //relies on driver
}
但是随后implicit
声明必须移出测试类。我想到了两种可能性:WebDriver
对象...
object WebDriver {
implicit val wd :WebDriver = new ChromeDriver()
...
...或在专用对象中。
object MyCoolPage {
import MyTestImplicits._
private val driver :WebDriver = implicitly[WebDriver]
...
总而言之,我不相信这值得付出努力。
推荐阅读
- javascript - 在搜索输入框中添加清除按钮
- python - 使用 selenium-webdriver 无法通过 xpath 找到元素
- odoo - 使用 on 函数计算两个字段
- javascript - 代码行给了我一个错误“渲染错误:”RangeError:无效的数组长度“”,但是,该行仍然按照它的意思做
- php - 如何使用 Laravel 运行 AngularJS 项目
- matlab - 如果 y 方向设置为“反向”,如何在 Matlab 中修复矢量注释头的错误对齐
- r - 如何编写一个 R 函数,从列索引而不是值中给出基因名称作为输出并发出错误?
- ruby - 无法在 Rubymine 2019.1 中使用 jRuby 9.1.17 运行规范
- python - 如何从 csv 文件中读取二维字典?
- regex - 多行正则表达式在 ruby 中不起作用