2015-07-26 5 views
0

Я изучаю Ruby на данный момент, и я решил переучить себя некоторыми шаблонами дизайна из онлайн-уроков (http://www.sitepoint.com/design-patterns-in-ruby-observer-singleton/). Поэтому у меня есть два класса файлов:Почему этот тест не работает?

автомобилей

require_relative 'Notifier' 
require 'observer' 

class Car 
include Observable 
attr_reader :mileage, :service 

def initialize(mileage = 0, service = 3000) 
    @mileage, @service = mileage, service 
    add_observer(Notifier.new) 
end 

def log(miles) 
    @mileage += miles 
    changed 
    notify_observers(self, miles) 
end 
end 

И Notifier:

class Notifier 
def update(car, miles) 
    puts "The car has logged #{miles} miles, totalling #{car.mileage} miles traveled." 
    puts "The car needs to be taken in for a service!" if car.service <= car.mileage 
end 

конец

Вот мой тест:

require_relative 'car' 
require "test/unit" 

class CarTest < 
Test::Unit::TestCase 

def test_simple 
    assert_equal("The car has logged 100 miles, totaling 2400 miles traveled.", Car.new(2300, 3000).log(100)) 
end 

end 

Но всякий раз, когда я бегу тест я получаю этот fai подумал, знает ли кто-нибудь, почему это происходит?

[1/1] CarTest#test_simpleThe car has logged 100 miles, totalling 2400 miles traveled. 
= 0.00 s 
1) Failure: 
test_simple(CarTest) [car_test.rb:8]: 
<"The car has logged 100 miles, totaling 2400 miles traveled."> expected but was 
<false>. 
+5

'puts' печатает на стандартный вывод. Но ваш тест ожидает возвратного значения из 'Car # log'. Вот почему он терпит неудачу. –

+0

Ой, вау, спасибо, что бы я всю ночь гадал! –

ответ

3

puts отпечатки к стандартному выпуску. Но ваш тест ожидает возвращаемого значения от Car#log. Вот почему он терпит неудачу.

На этом же примечании, почему вы тестируете внутренние элементы Notifier в тесте Car?

Лучшим подходом было бы удостовериться, что наблюдатель получает правильное сообщение и не заботится о его побочных эффектах здесь (и, конечно же, имеет специальную спецификацию для наблюдателя, которая проверила бы побочные эффекты и whatnot)

def test_simple 
    # sorry, RSpec lingo here, I'm not a minitest guy 
    expect_any_instance_of(::Notifier).to receive(:update).with(car, 2400) 

    Car.new(2300, 3000).log(100) 
end 
Смежные вопросы