Javascript 如何测试Scala.js库的JVM和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

我正在使用Scala.js,并且已经编写了一个trait,该trait是为JVM和js实现的。我正在使用第三方JVM和JS库在两个方面实现它,这应该在JVM和浏览器中提供功能等效的结果。但是,我需要编写一个测试来验证这一点

如果我只是测试两个香草Scala实现,我就会知道如何做。我会编写特征输入的生成器,并从中驱动每个函数,比较每个函数的结果。(我可以假设函数结果是布尔、整数、长、字符串、相同的集合,或者可以是toString()'d。)

有人在做这种测试吗

如果有一个实现是用Javascript实现的,我该怎么做?幻影(我可以将生成的JS文件传递给它,而不是将简单的JS作为字符串传递给它吗?)。然后,您可以使用结果并生成比较值的代码

因此,我们要编写一个宏,给定以下代码:

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 */ }