2012-10-19 9 views
5

Zdarzyło mi się napotkać wadliwe testy, które w całym moim rozumieniu powinny przejść. Czy brakuje mi czegoś oczywistego, tutaj?Błąd w Scalatest "DoubleTolerance"?

import org.scalatest._ 

class xxxTests extends FlatSpec with ShouldMatchers { 
    import math.{Pi => PI} 

    "" should "(this should pass)" in { 
    assert(0.0 === 0.0) // ok 

    (1e-100) should equal ((0.0) plusOrMinus 1e-5) // FAILS!!! "1.0E-100 did not equal DoubleTolerance(0.0,1.0E-5)" 
    (1e-3) should not equal ((0.0) plusOrMinus 1e-5) // ok 
    (0.0) should equal ((0.0) plusOrMinus 1e-5) // FAILS!!! "0.0 did not equal DoubleTolerance(0.0,1.0E-5)" 
    } 
} 

Doświadczyłem tego zarówno w Scalatest 1.8 i 2.0M4.

Odpowiedz

8

Problem: musi używać be, a nie equal.

Zostawiając tutaj jako znak mojej głupoty (ehem, brak ostrości).

https://groups.google.com/forum/?fromgroups=#!msg/scalatest-users/pb54GzOej6I/C9714h_OW_UJ

Musisz użyć plusOrMinus z "być" nie "równe". "równy" zawsze porównuje dla równości przez wywołanie == na jednym obiekcie, przekazując w innym . "be" robi różne rzeczy w zależności od tego, który obiekt jest oceniany jako zaliczony. Więc spróbuj:

0.5 musi być (0,5 plusOrMinus 0,1)

+4

No, nie bądź zbyt mocno na siebie. Myślę, że DSL zachęca do tego błędu. Mój oryginalny pomysł polegał na tym, że matchers potrzebowali jakiegoś sposobu, który zawsze oznacza wywoływanie == na dwóch obiektach, i to jest to, co równe. Z wyjątkiem tego, że wywołuje .deep na tablicy po lewej i prawej stronie, więc to wyjątek. Myślę, że "x powinno być równe (y plusOrMinus tol)" wygląda na to, że powinno działać, i widziałem więcej niż jednego użytkownika, spróbuj teraz. Myślę więc, że faktycznie będę obsługiwał tę składnię w najbliższej wersji ScalaTest. Jeśli ktoś naprawdę kiedykolwiek chce porównać dwie tolerancje dla równości, może to zrobić z zapewnieniem. –

Powiązane problemy