Проблема с модульным тестом ruby - PullRequest
0 голосов
/ 26 июля 2011

Пытался заставить работать следующий код, но не может; он говорит, что я вызываю приватный метод.

Что я делаю не так?

    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 голосов
/ 26 июля 2011

Ваш промежуточный итог работает в двух разных средах.

Один раз, это «автономный метод», в другой раз это числовой метод. Итак, давайте определим их как Числовой метод:

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)

Примечание к моему коду: я не вижу реальной причины для перехода на Float. Если вы начнете с 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)
0 голосов
/ 26 июля 2011

Хотелось бы получить больше информации, например, полное определение класса и трассировку ошибок, так как открытый метод to_f - единственный вызов этого метода, но я предполагаю, что subtotal определен как закрытый метод .

В определении класса Ruby ключевые слова, такие как public, protected и private, применяются к всем методам, которые идут после ключевого слова. Убедитесь, что определение subtotal не ниже private или protected в определении класса.

Если нет, то проблема, вероятно, кроется в другом. Проверьте трассировку ошибок и посмотрите, откуда на самом деле возникает ошибка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...