使用 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:
但这并不重要。
你做的很好
我在 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:
但这并不重要。
你做的很好