将函数转发到ScalaTest宏
我正在将一些QUnit Javascript测试转换为Scala。我所做的测试如下所示:将函数转发到ScalaTest宏,scala,scalatest,Scala,Scalatest,我正在将一些QUnit Javascript测试转换为Scala。我所做的测试如下所示: class XXX extends MyTests { test("equals", () => { val a = new XXX(x) val b = new XXX(y) ok(a.x != b.x, "Passed!") ok(a.y != b.y, "Passed!") ok(!a.equals(b), "Passed!") ok(!b.e
class XXX extends MyTests {
test("equals", () => {
val a = new XXX(x)
val b = new XXX(y)
ok(a.x != b.x, "Passed!")
ok(a.y != b.y, "Passed!")
ok(!a.equals(b), "Passed!")
ok(!b.equals(a), "Passed!")
a.copy(b)
ok(a.x == b.x, "Passed!")
ok(a.y == b.y, "Passed!")
ok(a.equals(b), "Passed!")
ok(b.equals(a), "Passed!")
})
}
MyTests
是我从ScalaTestFunSuite
我可以将代码中的ok
替换为assert
,也可以将以下内容放入MyTests
:
def ok(ok: Boolean, message: String) = assert(ok, message)
第一种解决方案产生了更好的测试,因为直接使用assert
意味着使用了ScalaTest
增强的assert
宏实现。第二个解决方案是更少的工作,因为我不必替换代码中的ok
是否有某种方法可以从
FunSuite
导入不同名称的assert
,或者将我的实现转发到ScalaTest宏,以便ok
的行为与assert
完全相同?谢谢。这很好,唯一的缺点是我无法在MyTests
中执行此操作,我需要在每个测试套件中重复此操作(导入不是继承的)。是否可以仅在MyTests
中执行某些操作?当然,只要def ok(…)=org.scalatest.Assertions.assertion(…)
,请参阅scalatest源代码以获取参数列表。这与问题中提到的“第二个解决方案”相同,但遗憾的是,该解决方案不起作用,因为宏不是从ok
调用站点接收参数,而是从ok
内部接收参数,其中参数已经是一个简单的布尔值。您需要提供一个宏而不是一个普通的函数才能使其工作。不,在您的示例中,您正在执行def ok(…)=scala.Predef.assert(…)
,这不是您想要的。如果转发不起作用,还可以手动内联scalatest assert的定义。我的观点是:只要看看该死的源代码,看看它是如何工作的!不,我不是MyTests
继承自FunSuite
,因此assert
取自ScalaTestAssertions
,而非scala.Predef
。我无法手动内联ScalaTestassert
的定义,因为宏实现是包私有的。
import org.scalatest.Assertions.{assert => ok}