2017-06-16 58 views
0

我有這樣的單元測試:「不是一個法律形式參數」

class MyServiceSpec extends WordSpec 
    with Matchers 
    with MockitoSugar 
    with BeforeAndAfterEach { 

    "MyService" must { 
    "succeed if my-endpoint succeeds" in { 
     Server.withRouter() { 
     GET("/my-endpoint") => Action { 
      Results.Ok.sendResource("myservice/my-endpoint.txt") 
     } 
     } { implicit port => 
     WsTestClient.withClient { client => 
      val result = Await.result(
      new RealMyService(client).getFromEndpoint(), 10.seconds) 
      result shouldEqual true 
     } 
     } 
    } 
    } 

} 

sbt告訴我:

» sbt test-only MyService 
... 
[error] /repos/myrepo/test/services/MyServiceSpec.scala:34: not a legal formal parameter. 
[error] Note: Tuples cannot be directly destructured in method or function parameters. 
[error]  Either create a single parameter accepting the Tuple1, 
[error]  or consider a pattern matching anonymous function: `{ case (param1, param1) => ... } 
[error]   GET("/my-endpoint") => Action { 
[error]   ^
[error] one error found 
[error] (test:compileIncremental) Compilation failed 
[error] Total time: 3 s, completed Jun 16, 2017 7:27:11 AM 

和IntelliJ告訴我:

Application does not take parameters: } expected 

上線:

GET("/my-endpoint") => Action { 

這究竟意味着什麼?

回答

1

Server.withRouter()期望模式匹配塊。事情是這樣的:

Server.withRouter() { 
    case GET("/my-endpoint") => Action(whatever) 
    case GET("/my-other-endpoint") => Action(whatever) 
    case POST("/my-other-endpoint") => Action(whatever) 
    case other => Action(whatever) // bad request 
} 

模式匹配僅僅是一個局部的功能,因此,例如

whatever.map((i: Int) => i) 

whatever.map { case (i: Int) => i } 

都做同樣的事情。但是,最大的區別在於第二個可以使用unapply()方法執行解構,這是模式匹配的全部要點。

回到您的案例 - 模式匹配用於匹配GET("/my-endpoint")案例類別(您可以免費獲得一些好東西的案例類別,例如自動爲您定義的unapply)。沒有模式匹配,你的塊沒有意義;這將是一個正常的功能,左手邊需要一個正式參數,例如(i: Int) => ...(s: String) => ...。有GET("/my-endpoint")根本沒有意義,它不是一個正式的參數(這是SBT試圖告訴你的)。

+0

謝謝!我意外刪除了「case」關鍵字,並且再也沒有注意到。雖然'sbt'和'IntelliJ'都不是很有幫助。 – dangonfast

+0

我看到你的痛苦,但另一方面,sbt似乎對我很有幫助。而不是有一個正式的參數,你有一個要評估的聲明。這就像是說'(1 + 2)=>什麼是一個函數。但無論如何,很高興你把它整理出來。 :) – slouc

+0

現在你提到它,'sbt'就是關鍵,但是我的思想頑固地拒絕了'sbt'提示中'case'關鍵字的確認!現在看,它似乎很明顯......我應該採取一個課程「如何閱讀錯誤信息,而不會錯過重要的零碎件」 – dangonfast

相關問題