2015-04-23 3 views
0

Я написал этот метод тестирования в Scala для тестирования службы REST.Scalatest «По крайней мере один» вместо Forall

@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 не является нулевым.

+0

Но вы * действительно * хочу быть для всех идентификаторов продукта, правильно? то есть. для всех идентификаторов продуктов каждый имеет информацию инвентаря, по крайней мере, с одним элементом, который не является нулевым? Является ли 'getInventoryInfo' коллекцией? –

+0

Нет точно. Я хочу найти хотя бы один идентификатор продукта с inventoryInfo! = Null –

+0

forAll в этом случае использует генератор Int по умолчанию для значений (я думаю). Я не уверен, что это то, что вы хотите. Вы уверены, что не хотите проверять одно конкретное значение? Вы смотрели на «когда-нибудь»? Это может помочь вам сузить то, что вы ищете, и использовать генераторы. Посмотрите http://www.scalatest.org/user_guide/generator_driven_property_checks для всякий раз. –

ответ

2

Предполагая, что мы список идентификаторов продукта:

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, поэтому синтаксис сильно отличается и не совсем так хорошо, если вам нужно сделать кучу вычислений.

2

forВсе можно передать конфигурацию для необходимого количества успешных оценок и допустимого количества неудачных оценок. Это должно выполнить то, что вы ищете. Documentation here в конце страницы.

Пример:

forAll (minSuccessful(1)) { (productId: Int) => ... 
Смежные вопросы