Использование НЕ должно создавать синтаксис [исключение] в ScalaTest

Я играю со Specs2 и ScalaTest для BDD в Scala. Я написал ожидания в Specs2, когда утверждаю, что данное исключение не должно вызываться.

"do something" in {
 {
   ....
 } must not(throwA[MyException])
}

Я надеялся, что смогу написать эквивалент в ScalaTest, например:

"do something" in {
 evaluating {
   ....
 } should not produce[MyException]
}

Но это не компилируется, и я не мог найти способ сделать это. Это вообще возможно?

Спасибо заранее.


person Guillaume Belrose    schedule 09.08.2011    source источник
comment
Интересный. Можете ли вы уточнить, что такое вариант использования? Я думаю, вам нужно что-то более конкретное. Либо он должен генерировать конкретное исключение, либо не должен генерировать никаких исключений. То, что вы говорите, это то, что вы хотите утверждать, что выражение может либо возвращаться нормально, либо генерировать любое исключение, кроме того, которое вы не хотите видеть. Если ваш вариант использования имеет смысл, я могу добавить синтаксис не производить. Спасибо.   -  person Bill Venners    schedule 09.08.2011
comment
@Bill, подумав немного о моем текущем варианте использования, я думаю, что поведение ScalaTest по умолчанию (сбой теста при возникновении какого-либо исключения) достаточно. Спасибо.   -  person Guillaume Belrose    schedule 11.08.2011


Ответы (2)


Это невозможно напрямую в последней версии ScalaTest, потому что метод should из EvaluatingApplicationShouldWrapper не имеет перегрузки, которая принимает NotWord, а только одну, которая принимает ResultOfProduceInvocation[T].

Я бы предложил просто позволить произойти нежелательному исключению, которое не пройдет тест. Это классический способ.

Но если вы чувствуете, что вам нужно больше ясности в отношении того, что именно не удалось, вы можете использовать блок try-catch для обработки ошибки. Если вы обнаружите ошибку, которую не хотите, обработайте исключение вызовом метода fail:

fail("That expression shouldn't have thrown a MyExceptionType exception")
person traffichazard    schedule 09.08.2011
comment
По состоянию на 2016 год это уже не так. См. ответ Вольфрама Арнольда. - person francoisr; 13.04.2016
comment
Таким образом, возможен только сбой в конкретном исключении. Использование try-catch и fail():try { doSomething() } catch { case ex: SomeException => fail("Should not throw SomeException", ex) } - person Bohumir Zamecnik; 21.07.2017

Текущая версия ScalaTest поддерживает это:

noException should be thrownBy 0 / 1

См. документацию.

person Wolfram Arnold    schedule 06.01.2016
comment
Я прихожу к этому ответу примерно раз в месяц. Однажды я запомню это. - person Def_Os; 30.04.2021