【问题标题】:Unit Testing Callbacks in Scala.jsScala.js 中的单元测试回调
【发布时间】:2018-01-20 08:41:09
【问题描述】:

嗨,我有一个使用 Akka 设置的演员模型,我正在使用回调设置一个 JS 外观。

几乎每个参与者都会进行某种长时间的计算并调用 js 提供的回调函数。

我想对此进行单元测试,但在想办法做到这一点时遇到了问题。这不是响应,而是演员在完成时调用的东西。

我需要一种在函数文字内使用断言的方法。如下所示。

val cb = (result: Double): Unit => {
  assert(result == Math.PI)
}

然后我可以将它传递给演员。

mathActor ! Compute("foo", cb)

actor 然后进行计算并调用 cb。

case Compute(foo, cb) =>
    // compute foo
    cb(foo)

谢谢

【问题讨论】:

    标签: scala unit-testing callback scala.js


    【解决方案1】:

    嗯。我根本没有使用过 Akka.js,所以我不知道它的含义。但原则上,您可能需要一个 Promise/Future 对,您的测试将在其中创建一个 Promise,该 Promise 在回调中完成,并取决于相应的 Future 来解决。

    所以原则上,它会是这样的。 (请注意,这是空洞的理论,不是我实际尝试过的。)

    def checkMyDouble():Future[Double] = {
      val promise = Promise[Double]
      val cb = (result: Double): Unit => {
        promise.success(result)
      }
      mathActor ! Compute("foo", cb)
      promise.future
    }
    
    checkMyDouble.map { result =>
      assert(result == Math.PI)
    }
    

    这里的概念是,您的单元测试需要一个可以等待的 Future,因此它知道何时完成。 Futures 来自 Promise,所以你不可避免地希望在混合的某个地方包含一个 Promise。

    请注意,上面没有任何类型的超时,您也想要,但它至少应该让您了解可能的方向......

    【讨论】:

      【解决方案2】:

      我在这里发布了一个示例,试图重现您解释的示例:https://scalafiddle.io/sf/xl9mtYG/0 我希望它有所帮助。

      此外,我不得不说,Akka.Js 支持 ask 模式,您可以将其用于外观:

      import akka.pattern._
      (mathActor ? Compute("foo")).map(cb)
      

      此处是询问模式的基本完整示例:https://scalafiddle.io/sf/yNDVuLn/0

      请随时询问此答案是否有任何遗漏。

      【讨论】:

        猜你喜欢
        • 2015-08-25
        • 2017-05-09
        • 2017-04-13
        • 2017-03-19
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 2015-07-09
        • 2018-07-29
        相关资源
        最近更新 更多