【问题标题】:Using assert:equals: in pharo在 pharo 中使用 assert:equals:
【发布时间】:2019-01-10 19:59:53
【问题描述】:

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

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

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

基本上,我需要能够在这里实现 10 % 的折扣,但是有一条消息“使用 assert:equals: 在规则失败时产生更好的上下文”,请你帮我解释一下它有什么问题。

【问题讨论】:

  • 您可能想询问供应商。出于某种原因,维护人员将此消息添加到语言中。 github.com/pharo-project/pharo/issues(但看起来他们希望您使用 :equals 方法/运算符而不是 = 运算符。)
  • 你需要有一个失败的方法来感知差异。我建议您编写错误的折扣并观察在错误报告中使用 assert: 与 assert:equals: 的区别。

标签: oop smalltalk pharo


【解决方案1】:

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

如果您的测试失败,assert: 无法打印有意义的失败消息,因为它可以访问的所有信息都是 false,所以它只能打印“我期望某些事情是真的,但事实并非如此。”

assert:equals: 可以访问这两个表达式的值,因此可以打印类似“我期望 foo 等于 bar”的内容。

由于良好的失败消息是测试库最重要的方面之一,因此测试库的作者正在指导您在他们的库中使用更具表现力的断言,而不是通用的“这是真的吗?”

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

【讨论】:

    【解决方案2】:

    我认为这个问题更多是关于 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 
    

    这又不是每日租金。

    所以,我的结论是,测试一定是错误的,或者折扣政策规定不充分。

    【讨论】:

      【解决方案3】:

      系统提示您可能要使用

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

      而不仅仅是#assert:

      但这并不重要。

      你做的很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-26
        相关资源
        最近更新 更多