2017-08-11 54 views
0

我已經嘗試了六種不同的方法,但似乎無法修改演員詢問的默認超時值。這意味着它幾乎總是在CI服務器上失敗。在akka測試工具包中修改詢問超時

這是我目前的迭代。有幾個捆綁在一起的嘗試。他們都沒有做任何修改超時值從1秒。

基礎測試類

import akka.actor.ActorSystem 
import akka.testkit.TestKit 
import com.typesafe.config.ConfigFactory 
import org.specs2.mutable.SpecificationLike 
import org.specs2.specification.AfterEach 
import org.specs2.specification.core.Fragments 

abstract class TestActors 
    extends TestKit(ActorSystem("testsystem", ConfigFactory.load("test-application.conf"))) 
    with SpecificationLike 
    with AfterEach { 
    override def map(fs: => Fragments) = super.map(fs)^step(system.terminate, global = true) 
    def after = system.terminate() 
} 

規格

class RepoSpec(implicit ee: ExecutionEnv) extends TestActors { 
    isolated 

    implicit val timeout = Timeout(5 seconds) 

    val repo = system.actorOf(Props(classOf[Repo], data)) 

    "return None when there's no such record" >> { 
    implicit val timeout = Timeout(30 seconds) 
    val record = repo ? GetRecord(1, RecordKey(1, 1, 1)) 
    record must beEqualTo(Option.empty[Record]).await 
    } 
} 

的src /測試/資源/測試application.conf

akka.test { 
    timefactor=10 
    single-expect-default=5000 
} 

在規格上我的筆記本電腦完成,但特拉維斯失敗:

[error] x return None when there's no such record 
[error] Timeout after 1 second (retries = 0, timeout = 1 second), timeFactor = 1 (TestActors.scala:10) 

編輯:很奇怪的是,在錯誤消息中引用該行是TestActors.scala:10 - 這是基本的測試類的類定義。

如果我能讓系統理解1秒太快,我會非常高興。

回答

0

您可以覆蓋timeout設置的東西超過一秒更大:

record must beEqualTo(Option.empty[Record]).await(timeout = 5.seconds) 

然而,recommended做法是CI服務器上運行測試時設置一個更高的timeFactor執行環境論點specs2。等待超時設置乘以timeFactor,默認值爲one。在您的測試中,timeout的值爲1秒,而timeFactor爲1,導致總超時時間爲1秒:1 second * 1。根據您的CI服務器更改timeFactor

+0

我沒有想過要試試規格timeFactor,因爲超時來自Akka,而不是Matcher。但是,它的工作。我不確定爲什麼。 – Synesso