2017-01-23 2 views
0

Как я могу получить доступ к переменным, которые определены внутри метода установки в Minitest?Ruby Minitest: переменные доступа в методе настройки

require 'test_helper' 

class TimestampTest < ActiveSupport::TestCase 
    setup do 
    @ag = AG.create(..., foo = bar(:foobar)) 
    @ap = AP.create(..., foo = bar(:foobar)) 
    @c = C.create(..., foo = bar(:foobar)) 
    end 

    [@ag, @ap, @c].each do |obj| 
    test "test if #{obj.class} has a timestamp" do 
     assert_instance_of(ActiveSupport::TimeWithZone, obj.created_at) 
    end 
    end 
end 

Если я запускаю это @ag, @ap и @c все nil. bar (: foobar) в строке 5-7 требуется для доступа к данным прибора.

ответ

1

Вы создаете переменные экземпляра, а затем ожидаете, что они будут существовать в контексте класса. Также есть проблема с операциями, которые вам не хватает: метод setup запускается только после того, как класс полностью определен, но вы сразу же используете эти переменные для определения класса.

Если вам нужны те, которые необходимо выполнить немедленно, удалите блок setup do ... end. Это также лучше следовать конвенции на Ruby и определить его так:

class TimestampTest < ActiveSupport::TestCase 
    CLASSES = [ 
    AG, 
    AP, 
    C 
    ] 

    setup do 
    @time_zones = CLASSES.map do |_class| 
     [ 
     class.name.downcase.to_sym, 
     _class.create(...) 
     ] 
    end.to_h 
    end 

    test "test if things have a timestamp" do 
    @time_zones.each do |type, value| 
     assert_instance_of(ActiveSupport::TimeWithZone, value.created_at) 
    end 
    end 
end 

Как примечание, ваш псевдо-код с вызовом метода формы (..., foo=...) создает постороннюю переменную foo без причины. Это должно быть опущено, если вы не указали foo: ..., где это аргумент именованного ключевого слова.

Смежные вопросы