Цикл for в спецификации сервера

У меня есть этот файл спецификации:

require 'spec_helper'

for i in 1..3
   describe file ("/var/tmp/efl_test_0#{i}_link" )do
      it { should be_linked_to "/tmp/efl_test_0#{i}" }
   end
end

Ожидаемые результаты:

   /var/tmp/efl_test01_link should be_linke_to /tmp/efl_test01
   /var/tmp/efl_test02_link should be_linke_to /tmp/efl_test02
   /var/tmp/efl_test03_link should be_linke_to /tmp/efl_test03

Фактические результаты таковы:

 Failure/Error: it { should be_linked_to "/tmp/efl_test_0#{i}" }
   stat -c %N /var/tmp/efl_test_01_link | egrep -e "-> ./tmp/efl_test_03."
 Failure/Error: it { should be_linked_to "/tmp/efl_test_0#{i}" }
   stat -c %N /var/tmp/efl_test_02_link | egrep -e "-> ./tmp/efl_test_03."
 Failure/Error: it { should be_linked_to "/tmp/efl_test_0#{i}" }
   stat -c %N /var/tmp/efl_test_03_link | egrep -e "-> ./tmp/efl_test_03."

Каждая ссылка сравнивается с целью 03. Проблема что-то о петле, я думаю.

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


person Neil H Watson    schedule 15.12.2014    source источник


Ответы (2)


Это может быть артефактом того, как i фиксируется как замыкание и лениво оценивается describe позже. В этот момент он был увеличен. Возможно, вам потребуется намеренно захватить его:

for i in 1..3
  path = "/tmp/efl_test_0#{i}"
  describe file ("/var/tmp/efl_test_0#{i}_link" )do
    it { should be_linked_to path }
  end
end

Обычно вы бы использовали 3.times do как более традиционный Ruby. Конструкция for практически не используется.

person tadman    schedule 15.12.2014
comment
Это странно. Обе эти строки должны быть оценены немедленно. Попробуйте использовать 3.times do |i|, а затем использовать вместо него #{i+1}, так как по умолчанию используется нулевой индекс. Я думаю, что проблема здесь может заключаться в том, что for не имеет правильной области видимости. - person tadman; 15.12.2014

Это работает:

require 'spec_helper'

3.times do |i|
   describe file ("/var/tmp/efl_test_0#{i+1}_link" )do
      it { should be_linked_to "/tmp/efl_test_0#{i+1}" }
   end
end

Полученные результаты:

    rspec ./spec/localhost/025_efl_test.rb:5 # 
File "/var/tmp/efl_test_01_link" should be linked to "/tmp/efl_test_01"
    rspec ./spec/localhost/025_efl_test.rb:5 # 
File "/var/tmp/efl_test_02_link" should be linked to "/tmp/efl_test_02"
    rspec ./spec/localhost/025_efl_test.rb:5 # 
File "/var/tmp/efl_test_03_link" should be linked to "/tmp/efl_test_03"
person Neil H Watson    schedule 15.12.2014
comment
Пожалуйста, не используйте ответы для общения с людьми. Stack Overflow — это не доска для разговоров; Это справочный сайт. Если ответ @tadman помог вам решить проблему, выберите его ответ. Нет необходимости показывать, какие изменения вы внесли, ни в отдельном ответе, ни в своем собственном. Если вы сами нашли ответ, то выберите свой ответ. В любом случае, если вы нашли решение, отметьте любой из ответов, чтобы мы могли сказать, что ответ найден. - person the Tin Man; 15.12.2014