2017-08-11 60 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

請隨時自由地詢問這個答案是否有任何缺失。