2014-12-03 32 views
0

我有一個用於檢查Web服務的測試代碼,一些繼承類帶來HttpService(不確定,哪一個),要求我在測試類中定義一個actorRefFactory引用。測試噴射路線:爲什麼需要定義actorRefFactory:ActorSystem?

有沒有更好的方法來做到這一點?

斯卡拉2.11.4,ScalaTest 2.2.1,1.3.2噴霧,阿卡2.3.6

class RestAPITest extends FlatSpec 
    with Matchers 
    with ScalatestRouteTest 
    with SprayJsonSupport 
    with MyRoute 
{ 
    // Without this, we get: 
    // << 
    // Error:(48, 7) class RestAPITest needs to be abstract, since method actorRefFactory in trait HttpService of type => akka.actor.ActorRefFactory is not defined 
    // << 
    // 
    def actorRefFactory: ActorSystem = system 

    ... 

回答

1

這位actor系統是噴霧需要的,因爲它是基於Akka演員。噴霧的慣用測試機制是使用spray-testkit項目。

spray-testkit文檔:

與噴霧testkit內置了試驗的基本結構是這樣的(在所有大寫表達佔位符):

REQUEST ~> ROUTE ~> check { 
    ASSERTIONS 
} 

在該模板請求是計算表達式到一個HttpRequest實例。由於RouteTest特性擴展了spray-httpx Request Building特性,因此您可以訪問其mini-DSL以實現方便簡潔的請求構建。

ROUTE是一個評估噴霧路由Route的表達式。您可以指定一個內聯或簡單地引用服務中定義的路由結構。

〜>鏈的最後一個元素是一個檢查調用,它將一個斷言塊作爲參數。在此模塊中,您可以在處理給定請求後,將您的要求定義到您的路線產生的結果。通常,您使用定義的「檢查器」之一來檢索路由響應的特定元素,並使用測試框架提供的測試DSL來對它進行斷言。例如,對於specs2,爲了驗證你的路由對狀態200響應的請求作出響應,你需要使用狀態檢查器並表達如下斷言:

status mustEqual 200 
+0

謝謝。我不明白的是爲什麼ScalatestRouteTest不能提供默認值,因爲通常情況下這些事情都是通過Scala中的暗示來完成的(對吧?)爲什麼不在這裏呢?命名一個抽象成員只是覺得有點不可思議。 – akauppi 2014-12-04 12:31:45

+0

不幸的是,我對這個問題沒有很好的答案。可能值得與郵件列表聯繫,看看你得到了什麼樣的答案。這可能是另一個演員系統,噴霧用於內部業務。這會使隱式聲明覆雜化,因爲你會有兩個ActorSystems。作者也可能確定人們通常希望用他們自己的ActorSystems進行測試。很難確定沒有通過代碼挖掘,雖然... – jxstanford 2014-12-04 19:32:33

+0

沒錯。將繼續。謝謝 – akauppi 2014-12-05 09:17:58

-3

的錯誤說,你需要演員在HTTP服務產卵的actorRefFactory。所以請繼續。