Использование assert: equals: in pharo - PullRequest
0 голосов
/ 10 января 2019

У меня есть следующая программа на Pharo: 2 класса Yacht и YachtRental, Test Class и YachtRental test. Мне нужно реализовать следующее: на 4-й день клиент получает скидку = 10% от дневной ставки. Вот мой код:

Мне нужно реализовать следующее: на 4-й день клиент получает скидку = 10% от дневной ставки. Вот мой код:

| yachtRental myCruise |
    yachtRental := YachtRental new.
    myCruise := Yacht cruise.
    self assert: (yachtRental priceFor: myCruise days: 4) = 890

По сути, я должен иметь возможность реализовать скидку в 10% здесь, однако есть сообщение «Использование assert: равно: создает лучший контекст при сбое правила», не могли бы вы помочь мне объяснить, что с ним не так.

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Я думаю, что вопрос скорее о кодировании yachtRental priceFor: myCruise days: 4, чем о более тонкой проблеме #assert: против #assert:equal: (что, кстати, Йог объяснил так четко.)

Достаточно интересно, что код #priceFor:days:, кажущийся простым, вызывает некоторые сомнения относительно теста и спецификации скидки.

Следует ли применять скидку к каждому дню периода проката, если этот период длится 4 или более дней? Или это должно быть применено к дням 4, 5 и т. Д.? 1009 *

В первом случае логика будет

priceFor: aYacht days: anInteger
  | price |
  price := aYacht dailyRate * anInteger.
  anInteger >= 4 ifTrue: [price := price * 0.9].
  ^price

а во втором

priceFor: aYacht days: anInteger
  | rate |
  rate := aYacht dailyRate.
  ^anInteger < 4
     ifTrue: [rate * anInteger.]
     ifFalse: [rate * 3 + (rate * 0.9 * (anInteger - 3))]

Математически, первая политика скидок будет составлять цену

rate * 4 * 0.9

, который должен равняться (каламбур) 890. Это означает, что rate должно удовлетворять

rate = 890 / (4 * 0.9) = 247.222222222222 

что довольно смешно, не правда ли?

А как насчет второй политики. В этом случае у нас будет

rate * 3 + (rate * 0.9 * (4 - 3)) = 890

или

rate * (3 + 0.9) = 890

1033 * поэтому *

rate = 890 / 3.9 = 228.205128205128 

, что опять-таки не похоже на суточную арендную ставку.

Итак, я пришел к выводу, что тест должен быть неверным или политика скидок не указана.

0 голосов
/ 12 марта 2019

Система предполагает, что вы можете использовать

самоутверждаться: (яхтаАрендная цена для: myCruise onDay: 4)
равно: 890

вместо только #assert:

но это не имеет значения.

То, что вы сделали, просто прекрасно.

0 голосов
/ 11 января 2019

assert: принимает логическое значение, тогда как assert:equals: принимает два выражения. И assert: не знает, что вы тестируете, но assert:equals: знает, что вы тестируете, чтобы две вещи были равны.

В случае неудачного теста assert: не может напечатать значимое сообщение об ошибке, поскольку вся информация, к которой он имеет доступ, false, поэтому все, что он может напечатать, это «Я ожидал, что что-то будет правдой, но это не так . "

assert:equals: имеет доступ к значениям двух выражений и может, таким образом, напечатать что-то вроде «Я ожидал, что foo будет равно bar».

Так как хорошие сообщения об ошибках являются одним из наиболее важных аспектов библиотеки тестов, авторы библиотеки тестов рекомендуют вам использовать более выразительные утверждения в своей библиотеке вместо общего "правда ли это?"

[Примечание: я игнорирую отражение здесь. Конечно, оба метода могут рефлексивно проверить исходный код теста.]

...