2015-01-07 5 views
4

Я только начал использовать ScalaTest и я использую следующие для сравнения двух двойников в моей спецификации следующим образом:Обработка Парный в ScalaTest

it should "calculate the price" in { 
    val x = new X(10,10,12,1000) 
    assert(x.price() === 185.92) 
    } 

Спецификация проходит, хотя я поставил в неверном значении 185.92 для сравнения с тем, что возвращает функция цены (что фактически возвращает 10.23 для вышеприведенного случая). У меня есть другие спецификации, где я просто сравниваю Ints, и они работают должным образом. Но те, которые связаны с Doubles, проходят независимо. Есть ли другие функции, кроме assert Я должен использовать для сравнения Doubles?

EDIT:

def price() : Double 
+0

Не ваш актуальный вопрос, но вы не должны использовать 'Double' (или любой тип с плавающей точкой), чтобы представить цену. Вместо этого используйте 'BigDecimal' или тип Spire - тип, который может выполнять точную десятичную арифметику. – lmm

+0

Да, я буду использовать Spire, но сейчас я просто экспериментирую с ScalaTest. –

+0

Моя первая теория заключается в том, что x.price() возвращает тип, который считает, что этот экземпляр равен Double 185.92. Можете ли вы показать, какой тип x.price() возвращается? Кроме того, вы можете смешивать в org.scalactic.TypeCheckedEquality или импортировать org.scalactic.TypeCheckedEquality._, чтобы получить ошибку типа, если типы не совпадают. –

ответ

8

Он смотрит на меня, как у вас есть неявное экземпляр Equality[Double] в объеме вдоль линий org.scalactic.TolerantNumerics, для которых документация по here.

Пример из дока является:

implicit val doubleEquality = TolerantNumerics.tolerantDoubleEquality(0.01) 

Но, похоже, кто-то инстанцировали его с очень большим значением допуска в вашем случае.

Вы также можете рассмотреть пытается явную терпимость с помощью +-:

assert(x.price() === 185.92 +- 0.01) 
Смежные вопросы