2017-08-11 66 views
0

嗨,所以我有一个使用Akka设置的演员模型,并且我使用回调设置JS外观。在Scala.js单元测试回调

几乎每个角色都做某种长时间的计算,并调用一个js提供的回调和结果。

我想单元测试这个,但有问题想办法做到这一点。这不是一个回应,而是一个演员在完成时所调用的东西。

我需要一种方法来使用函数文本中的断言。如下所示。

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

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

mathActor ! Compute("foo", cb) 

然后,演员进行计算并调用cb。

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

感谢

回答

0

嗯。我根本没有使用过Akka.js,所以我不知道它的含义。但原则上,你可能需要一个Promise/Future对,你的测试会创建一个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) 
} 

这里的概念是,你的单元测试需要一个未来,它可以等待,所以它知道它何时完成。期货来自Promises,所以你不可避免地希望有一个Promise参与混合的某个地方。

注意上面没有任何类型的超时的,你也想,但它应该给你至少可能的方向的想法...

0

我这里和大家分享尝试一个例子重现你解释的例子:https://scalafiddle.io/sf/xl9mtYG/0我希望它有帮助。

而且我不得不说的是,要求图案在Akka.Js支持,你可以利用它的外墙:

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

这里问格局基本完整的例子:https://scalafiddle.io/sf/yNDVuLn/0

请随时自由地询问这个答案是否有任何缺失。