Javascript 如何测试Scala.js库的JVM和js实现的等效性?
我正在使用Scala.js,并且已经编写了一个trait,该trait是为JVM和js实现的。我正在使用第三方JVM和JS库在两个方面实现它,这应该在JVM和浏览器中提供功能等效的结果。但是,我需要编写一个测试来验证这一点 如果我只是测试两个香草Scala实现,我就会知道如何做。我会编写特征输入的生成器,并从中驱动每个函数,比较每个函数的结果。(我可以假设函数结果是布尔、整数、长、字符串、相同的集合,或者可以是toString()'d。) 有人在做这种测试吗 如果有一个实现是用Javascript实现的,我该怎么做?幻影(我可以将生成的JS文件传递给它,而不是将简单的JS作为字符串传递给它吗?)。然后,您可以使用结果并生成比较值的代码 因此,我们要编写一个宏,给定以下代码:Javascript 如何测试Scala.js库的JVM和js实现的等效性?,javascript,scalatest,scala.js,Javascript,Scalatest,Scala.js,我正在使用Scala.js,并且已经编写了一个trait,该trait是为JVM和js实现的。我正在使用第三方JVM和JS库在两个方面实现它,这应该在JVM和浏览器中提供功能等效的结果。但是,我需要编写一个测试来验证这一点 如果我只是测试两个香草Scala实现,我就会知道如何做。我会编写特征输入的生成器,并从中驱动每个函数,比较每个函数的结果。(我可以假设函数结果是布尔、整数、长、字符串、相同的集合,或者可以是toString()'d。) 有人在做这种测试吗 如果有一个实现是用Javascrip
FuncTest.test { (1.0).toString }
可以生成如下内容:
assert("1.0" == (1.0).toString)
这听起来比实际情况更难。让我们从FuncTest
的宏框架开始:
import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context
object FuncTest {
def test[T](x: => T): Unit = macro FuncTestImpl.impl[T]
}
class FuncTestImpl(val c: Context) {
import c.universe._
def impl[T : WeakTypeTag](x: Tree): Tree = ???
}
在impl
中,我们希望在x
中运行代码,然后生成一个断言(或任何适合您使用的测试框架的断言):
我们唯一的问题是reifyLiteral
。它基本上应该取一个任意值并从中创建一个文本。总的来说,这很难/不可能。但是,对于一些基本值(原语、字符串等)来说非常容易:
就这样。你现在可以写:
FuncTest.test { /* your code */ }
为计算库自动生成测试
警告工具箱目前没有注入正确的类路径。因此,如果您使用外部库(我假设您使用),您也需要对其进行调整。如果您需要帮助,请告诉我。请澄清:我要测试的库没有在DOM上运行。这纯粹是一个计算库。简单地交叉编译测试有什么错?由于trait在两个平台上都有相同的API,因此可以根据该API交叉编译测试。或者我在图片中遗漏了一些东西。对于一些测试,我已经手工编码了预期的结果,我可以这样做。对于大多数情况,我宁愿验证JVM和JS实现的结果是否相等,而不验证每一个都是一个特定的值。(我对用于实现JVM端的第三方库有很高的信心。)
/** Creates a literal tree out of a value (if possible) */
private def reifyLiteral(x: Any): Tree = x match {
case x: Int => q"$x"
case x: String => q"$x"
// Example for Seq
case x: Seq[_] =>
val elems = x.map(reifyLiteral)
q"Seq(..$elems)"
case _ =>
c.abort(c.enclosingPosition, s"Cannot reify $x of type ${x.getClass}")
}
FuncTest.test { /* your code */ }