2011-08-09 17 views
14

Używam specyfikacji Specs2 i ScalaTest dla BDD w Scali. Napisałem oczekiwania w specyfikacji 2, gdy twierdzę, że dany wyjątek nie powinien być rzucany.Używanie składni "should not produce [exception]" w ScalaTest

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

Miałem nadzieję, aby móc napisać równowartość w ScalaTest jak:

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

Ale to nie kompiluje i nie mogłem znaleźć sposób to zrobić. Czy to w ogóle jest możliwe?

Wielkie dzięki z góry.

+0

Interesujące. Czy możesz wyjaśnić, co to jest przypadek użycia? Sądzę, że chcesz czegoś bardziej konkretnego. Powinien albo rzucić określony wyjątek, albo nie powinien zgłaszać żadnego wyjątku. Mówisz, że chcesz potwierdzić, że wyrażenie może powrócić normalnie lub rzucić wyjątek, z wyjątkiem tego, którego nie chcesz widzieć. Jeśli twój przypadek użycia ma sens, mogę dodać składnię "nie produkować". Dzięki. –

+0

@Bill, myśląc nieco dłużej o moim aktualnym przypadku użycia, myślę, że domyślne zachowanie ScalaTest (niepowodzenie testu, jeśli występuje jakikolwiek wyjątek), jeśli wystarczające. Dzięki. –

Odpowiedz

7

Nie jest to możliwe bezpośrednio w najnowszej wersji ScalaTest ponieważ metoda should z EvaluatingApplicationShouldWrapper nie ma przeciążenia, która pobiera NotWord, tylko jeden, który trwa ResultOfProduceInvocation[T].

Proponuję po prostu pozwolić na niepożądany wyjątek, który nie przejdzie testu. To jest klasyczny sposób.

Ale jeśli uważasz, że potrzebujesz większej jasności co do tego, czego dokładnie nie udało się, możesz użyć bloku try - catch, aby poradzić sobie z błędem. Jeśli złapiesz błąd nie chcesz się zdarzyć, uchwyt wyjątku z wywołaniem metody fail:

fail("That expression shouldn't have thrown a MyExceptionType exception") 
+2

Od 2016 r. Nie jest to już prawdą. Zobacz odpowiedź Wolframa Arnolda. – francoisr

+0

W ten sposób możliwe jest niepowodzenie tylko w określonych wyjątkach. Używanie try-catch i fail(): '' 'try { doSomething() } catch { case ex: SomeException => fail (" Nie powinno rzucać SomeException ", ex) }' '' –

24

Aktualna wersja ScalaTest nie obsługuje to:

noException should be thrownBy 0/1 

Zobacz docs.

Powiązane problemy