带有未来结果的 Specs2 数据表
Specs2 Data Tables with future results
我正在努力解决以下问题:
我有一个方法 returns a Future[Result] 其中 Result 是我想用数据 table specs2 中的行。
据我了解,以下代码每次都会阻塞并等待结果可用。
def getDataForInput(input: String) : Future[Result]
def myTest =
"input" | "expectedResult" |>
"a" ! 123 |
"b" ! 0 | {
(input, result) => getDataForInput input must( beEqualTo(result).await )
}
通常我想异步进行所有调用,然后使用 Future.sequence 转换 Seq[Future[Result]]到Future[Seq[Result]]然后运行测试。
有没有明智的方法来做到这一点?
没有容易的方法,你需要解构和重建一些东西
type RowResult = (Seq[String], Result)
val table =
"input" | "expectedResult" |
"123" ! 123 |
"0" ! 1 |
"0" ! 0
// get a Future containing all rows and results
val results: Future[List[RowResult]] = table.rows.toList.traverseU { row =>
getDataForInput(row.t1).map { i =>
(row.showCells, (i must beEqualTo(row.t2)).toResult)
}
}
// check the results
results must beSuccessfulTable(table.titles).await
这使用了一个自定义匹配器,它将 table 更好地显示
// the TextTable does an even display of columns
import org.specs2.text.TextTable
def beSuccessfulTable(titles: Seq[String]): Matcher[List[RowResult]] = { values: List[RowResult] =>
val overallSuccess = values.map(_._2).reduce(_ and _).isSuccess
val headers = if (overallSuccess) titles else Seq("")++titles++Seq("")
val table = TextTable(headers, values.map(resultLine.tupled))
(overallSuccess, table.show)
}
// helper method
def resultLine = (line: Seq[String], result: Result) => {
val message = if (result.isSuccess) "" else result.message
result.status +: line :+ message
}
我正在努力解决以下问题: 我有一个方法 returns a Future[Result] 其中 Result 是我想用数据 table specs2 中的行。
据我了解,以下代码每次都会阻塞并等待结果可用。
def getDataForInput(input: String) : Future[Result]
def myTest =
"input" | "expectedResult" |>
"a" ! 123 |
"b" ! 0 | {
(input, result) => getDataForInput input must( beEqualTo(result).await )
}
通常我想异步进行所有调用,然后使用 Future.sequence 转换 Seq[Future[Result]]到Future[Seq[Result]]然后运行测试。
有没有明智的方法来做到这一点?
没有容易的方法,你需要解构和重建一些东西
type RowResult = (Seq[String], Result)
val table =
"input" | "expectedResult" |
"123" ! 123 |
"0" ! 1 |
"0" ! 0
// get a Future containing all rows and results
val results: Future[List[RowResult]] = table.rows.toList.traverseU { row =>
getDataForInput(row.t1).map { i =>
(row.showCells, (i must beEqualTo(row.t2)).toResult)
}
}
// check the results
results must beSuccessfulTable(table.titles).await
这使用了一个自定义匹配器,它将 table 更好地显示
// the TextTable does an even display of columns
import org.specs2.text.TextTable
def beSuccessfulTable(titles: Seq[String]): Matcher[List[RowResult]] = { values: List[RowResult] =>
val overallSuccess = values.map(_._2).reduce(_ and _).isSuccess
val headers = if (overallSuccess) titles else Seq("")++titles++Seq("")
val table = TextTable(headers, values.map(resultLine.tupled))
(overallSuccess, table.show)
}
// helper method
def resultLine = (line: Seq[String], result: Result) => {
val message = if (result.isSuccess) "" else result.message
result.status +: line :+ message
}