2017-08-11 4 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をまったく使用していないので、その意味は分かりません。しかし、原則として、プロミスと未来のペアが必要なようです。プロミスは、コールバック内で完了し、解決する対応する未来に依存します。

したがって、原則として、このようなものになります。 (マインドは、この風通しの良い理論ではなく、私が実際に試してみたものです。)

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) 
} 

ここ概念は、あなたのユニットテストは、それが待っていることができるという未来を必要とするので、それが完了したとき、それは知っているということです。先物は約束から来ているので、あなたは必然的に約束のどこかに関わってほしいと思うことがあります。上記は、あなたがまたたいと思うタイムアウトの任意の並べ替えを、持っていないが、それはあなたが可能な方向の少なくともアイデアを与える必要があり

注...

0

は、私はここにしようと例を掲載しましたあなたが説明した例を再現する:https://scalafiddle.io/sf/xl9mtYG/0私はそれが助けてくれることを願っています。

また、私が尋ねるパターンがAkka.Jsでサポートされていて、ファサードのためにそれを活用できることを言わなければならない:

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

の基本的な例は、ここにパターンを尋ねる:https://scalafiddle.io/sf/yNDVuLn/0

感じてくださいこの答えに欠けているビットがあるかどうか尋ねることは自由です。

関連する問題