2016-10-03 2 views
2

У меня есть тест org.scalatest.FunSpec with org.scalatest.Matchers, который выполняет следующие действия, например:Scalatest: должны быть Matchers с дополнительным описанием?

val tol = 1e-10 
val res = 1.000000000000001 
val ref = 1.000000000000000 
res should be (ref +- tol) 

но делает это в цикле для нескольких случаев введенного пользователя по имени, конечно, я не могу изменить зернистость протестированного кода, так что я получить коллекцию значений с этими именами, связанных с ними. Поэтому для теста выше мне нужно добавить дополнительный контекст или дополнительное описание name, чтобы определить, к какому имени оно относится. Мне нужно что-то вроде:

val name : String = ... 
res should be (ref +- tol) for name 

Я не могу использовать it и describe в этот момент, потому что они уже снаружи.

ответ

3

Это действительно зависит от того, что вы пытаетесь сделать, и вы, вероятно, следует добавить более полный пример чего вы пытаетесь достичь, но вы можете использовать describe в цикле. Например:

class TempTest extends FunSpec with Matchers { 

    describe("Some example test") { 

    (1 to 10).foreach { i => // your loop here 

     describe(s"Scenario $i") { 
     it("should be equal to itself") { 
      i shouldBe i 
     } 
     } 
    } 
    } 
} 

UPDATE: Вы можете использовать withClue добавить больше контекста согласовани т.д .:

withClue("Some clarifying message") { 
    i shouldBe 5 
} 

Это добавит строку подсказки к ошибке, если условия не удается.

+0

Хорошо, но предположим, что я не могу этого сделать ... у нас есть скалярное расширение, которое отправляет тесты, которые будут вычисляться удаленно в кластере ... эта структура уже занимает верхнюю 'описать' и автоматически обертывает каждый тест в' it', который описывает его так ... Мне нужен способ привязать текст 'name' к' res должно быть (ref +-tol) ' условие ... может быть, единственный способ - поймать и обогатить потенциал 'TestFailedException' ... и, конечно, переходить к' assertResult' - это еще одна возможность просто отказаться от аргумента If –

+0

@GiovanniAzua, который поможет вам пример в обновлении? –

+0

Вот и все, вы пригвоздили его :) Я очень рад, что scalatest спроектирован таким образом, что практически нет сценария реальной жизни: D –

1

Вероятно, данныйWhenThen может использоваться для добавления контекста к отчетам об испытаниях. Я не уверен, как именно вы обернуть несколько тестов в цикле, но вот идея:

import org.scalatest.{GivenWhenThen, WordSpec} 

/** 
    * Created by alex on 10/3/16. 
    */ 
class Temp extends WordSpec with GivenWhenThen{ 
    val names = List("Alex", "Dana") 
    for(name <- names)yield{ 
    "Reversing a name " + name + " two times" should { 
     "result in the same name" in{ 
     Given("name " + name) 
     When("reversed two times") 
     val reversed = name.reverse.reverse 
     Then("it should be the same") 
     assert(name === reversed) 
     } 
    } 
    } 
} 
+0

Это хороший указатель, однако я должен отказаться от лучшей ошибки контекста, созданной 'res должно быть (ref +-tol)' и вместо этого использовать assert. Я также могу переключиться на утверждение напрямую без 'GivenWhenThen' –

+0

согласен, все действительные точки –

 Смежные вопросы

  • Нет связанных вопросов^_^