红宝石单元测试问题

时间:2011-07-26 03:00:15

标签: ruby unit-testing

一直试图让以下代码工作,但不能;它说我正在调用私人方法。

我做错了什么?

    def subtotal(price, qty = 1)
      return nil if price.to_f<= 0 || qty.to_f <= 0
      price.to_f * qty.to_f
    end

    puts subtotal(12.93)
    puts subtotal(12.93, 3)
    puts subtotal(456.82, 6)

     def subtotal(qty = 1)
       return nil if price.to_f<= 0 || qty.to_f <= 0
       self.to_f * qty.to_f
     end

     book = 39.99
     car = 16789

     puts book.subtotal(3)
     puts car.subtotal
     puts car.subtotal(7)

2 个答案:

答案 0 :(得分:0)

虽然我想了解更多信息,比如完整的类定义和错误跟踪,因为公共方法to_f是此处唯一的其他方法调用,我猜测subtotal已定义作为私人方法。

在Ruby类定义中,publicprotectedprivate等关键字适用于关键字之后的所有方法。检查类subtotal中的private定义是否低于protected或{{1}}。

如果没有,那么问题可能在其他地方。检查错误跟踪,并查看错误实际的来源。

答案 1 :(得分:0)

您的小计适用于两种不同的环境。

有一次,它是一种“独立的方法”,另一次是一种数字方法。所以,让我们将它们定义为Numeric-method:

def subtotal(price, qty = 1)
  return nil if price <= 0 || qty <= 0
  price * qty
end

class Numeric
   def subtotal(qty = 1) #only one paramter. The other is 'self'
     return nil if self <= 0 || qty <= 0
     self * qty
   end
 end

puts subtotal(12.93)
puts subtotal(12.93, 3)
puts subtotal(456.82, 6)


 book = 39.99
 car = 16789

 puts book.subtotal(3)
 puts car.subtotal
 puts car.subtotal(7)

备注我的代码:我没有看到转换为Floats的真正原因。如果你从Fixnums开始(参见你的汽车示例),那么我的解决方案也可以。也许,您需要根据具体情况进行转换。

从您的示例代码中我更喜欢定义一个Articcle类:

def subtotal(price, qty = 1)
  return nil if price <= 0 || qty <= 0
  price * qty
end

class Article
    def initialize(price = 0)
        @price = price
      end
   def subtotal(qty = 1)
     return nil if @price <= 0 || qty <= 0
     @price * qty
   end
 end

puts subtotal(12.93)
puts subtotal(12.93, 3)
puts subtotal(456.82, 6)


 book = Article.new(39.99)
 car = Article.new(16789)

 puts book.subtotal(3)
 puts car.subtotal
 puts car.subtotal(7)