Scala Mock Syntax (class _).expects 是什么意思?
Scala Mock Syntax (class _).expects meaning?
Scala 新手,已广泛搜索以澄清某些 ScalaMock 语法。根据 this guide,我一直看到以下一般测试模式:
(myClass.myMethod _).expects()
这里究竟发生了什么? class/method/space/underscore 有什么作用?编译器如何处理这个?
附加的_
强制将方法转换为函数。
为了理解为什么这是必要的,让我们尝试重新构建一小块 Scalamock,即 expects
方法。 expects
方法似乎是在模拟对象的方法上调用的。但是方法/函数没有 expects
方法开头。因此,我们必须使用 "pimp my library" 模式将方法 expects
附加到函数。我们可以这样做:
implicit class ExpectsOp[A, B](f: A => B) {
def expects(a: A): Unit = println("it compiles, ship it...")
}
现在让我们用方法 baz
:
定义一个 class Bar
class Bar {
def baz(i: Int): Int = i * i
}
还有一个 Bar
的实例:
val bar = new Bar
让我们看看如果您尝试在 bar.baz
上调用 expects
会发生什么:
(bar.baz).expects(42)
error: missing argument list for method baz in class Bar
Unapplied methods are only converted to functions when a function type is expected. You can make this conversion explicit by writing baz _
or baz(_)
instead of baz
.
因此,如果不显式转换为函数,它就无法工作,我们必须通过附加 _
:
来强制执行此转换
(bar.baz _).expects(42) // prints: "it compiles, ship it..."
Scala 新手,已广泛搜索以澄清某些 ScalaMock 语法。根据 this guide,我一直看到以下一般测试模式:
(myClass.myMethod _).expects()
这里究竟发生了什么? class/method/space/underscore 有什么作用?编译器如何处理这个?
附加的_
强制将方法转换为函数。
为了理解为什么这是必要的,让我们尝试重新构建一小块 Scalamock,即 expects
方法。 expects
方法似乎是在模拟对象的方法上调用的。但是方法/函数没有 expects
方法开头。因此,我们必须使用 "pimp my library" 模式将方法 expects
附加到函数。我们可以这样做:
implicit class ExpectsOp[A, B](f: A => B) {
def expects(a: A): Unit = println("it compiles, ship it...")
}
现在让我们用方法 baz
:
Bar
class Bar {
def baz(i: Int): Int = i * i
}
还有一个 Bar
的实例:
val bar = new Bar
让我们看看如果您尝试在 bar.baz
上调用 expects
会发生什么:
(bar.baz).expects(42)
error: missing argument list for method baz in class Bar Unapplied methods are only converted to functions when a function type is expected. You can make this conversion explicit by writing
baz _
orbaz(_)
instead ofbaz
.
因此,如果不显式转换为函数,它就无法工作,我们必须通过附加 _
:
(bar.baz _).expects(42) // prints: "it compiles, ship it..."