对于Forall而言,反对“至少一个”

时间:2015-04-23 16:21:27

标签: scala testing scalatest scalacheck

我在Scala中编写了这个测试方法来测试REST服务。

@Test def whenRequestProductInfo() {
  // When Request Product Info
  forAll { (productId: Int) =>
      val result = mockMvc().perform(get(s"/products/$productId")
        .accept(MediaType.parseMediaType(APPLICATION_JSON_CHARSET_UTF_8)))
        .andExpect(status.isOk)
        .andExpect(content.contentType(APPLICATION_JSON_CHARSET_UTF_8))
        .andReturn;

      val productInfo = mapper.readValue(result.getResponse.getContentAsString, classOf[ProductInfo])

      // At least one is not null
      // assert(productInfo.getInventoryInfo != null)
  }
}

但我想测试至少有一个productInfo.getInventoryInfo不为空而不是每个productInfo.getInventoryInfo都不为空

2 个答案:

答案 0 :(得分:2)

假设我们有一个产品ID列表:

val productIds: List[Int] = ???

我们应该将转化从productId计算到productInfo到另一个val。 (我认为这种方法或类似的东西会存在于其他地方的代码中。)

val inventoryInfo = productIds.map { case productId =>
    val result = mockMvc().perform(get(s"/products/$productId")
        .accept(MediaType.parseMediaType(APPLICATION_JSON_CHARSET_UTF_8)))
        .andExpect(status.isOk)
        .andExpect(content.contentType(APPLICATION_JSON_CHARSET_UTF_8))
        .andReturn

    val productInfo = mapper.readValue(result.getResponse.getContentAsString, classOf[ProductInfo])
    productInfo.getInventoryInfo
 }

现在我们有一个库存信息列表,无论是哪种类型。我们可以使用atLeast来检查集合中至少有一个库存信息不是null

atLeast(1, inventoryInfo) should not be null

ScalaTest似乎没有像forAll这样的任何curried版本,所以语法差别很大,如果你需要做一堆计算,那就不太好了。

答案 1 :(得分:2)

forAll可以传递配置,以获得所需的成功评估次数和允许的失败评估次数。这应该可以实现您的目标。 Documentation here位于页面末尾。

示例:

forAll (minSuccessful(1)) { (productId: Int) =>  ...