使用 assert:equals:在 pharo

Using assert:equals: in pharo

我在 Pharo 中有以下程序:2 类 Yacht 和 YachtRental,测试 Class 和 YachtRental 测试。我需要执行以下操作:在第 4 天,客户获得每日费率的折扣 = 10%。这是我的代码:

我需要执行以下操作:在第 4 天,客户获得每日费率的 10% 折扣。这是我的代码:

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

基本上,我需要能够在这里实现10%的折扣,但是有一个消息"Using assert:equals: produces better context on rule failure",你能帮我解释一下它有什么问题吗?

assert: 接受一个布尔值,而 assert:equals: 接受两个表达式。而且,assert: 不知道你在测试什么,但 assert:equals: 知道你在测试两个东西是否相等。

如果您的测试失败,assert: 无法打印有意义的失败消息,因为它可以访问的所有信息都是 false,所以它只能打印 "I expected something to be true but it wasn't."

assert:equals: 可以访问两个表达式的值,因此可以打印类似 "I expected foo to be equal to bar".

的内容

由于良好的失败消息是测试库最重要的方面之一,因此测试库的作者正在指导您使用其库中更具表现力的断言,而不是通用的 "is this true?"

[注意:我这里忽略了反射。当然,这两种方法都可以反思性地检查测试的源代码。]

我认为问题更多的是关于 yachtRental priceFor: myCruise days: 4 的编码,而不是关于 #assert:#assert:equal: 的更微妙的问题(顺便说一句,Jög 解释得很清楚.)

有趣的是,#priceFor:days: 的编码看似简单,但对测试和折扣规范提出了一些疑问。

当租期为 4 天或以上时,折扣是否应适用于租期的每一天?还是应该应用于第 4 天、第 5 天等?

在第一种情况下,逻辑是

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

因此

rate = 890 / 3.9 = 228.205128205128 

同样,这看起来不像是每日租金。

所以,我的结论是,一定是测试有误,或者优惠政策没有明确规定。

系统提示您可能要使用

self assert: (yachtRental priceFor: myCruise onDay: 4)
等于:890

而不仅仅是#assert:

但这并不重要。

你做的很好