Ответ 1
Это не работает, потому что... RSpec не... "видеть" любые спецификации на время компиляции...
Мне было интересно, почему и какое-то исследование. Если вы изучите следующий код и вывод, вы можете сделать некоторые выводы:
- в Ruby отсутствует время компиляции
- тело класса/модуля немедленно оценивается и выполняется
- Таким образом, метод
describe
- тело блока
describe
немедленно обрабатывается RSpec - RSpec хранит блоки
before
иit
для последующего выполнения - когда разбор файла завершается, RSpec начинает сообщать
describe
и выполнение сохраненных блоковbefore/it
Следующий код демонстрирует это.
module SO
puts '>>>>> Ruby sees module SO and executes/evaluates its body'
cases = [1,2,3]
describe "SO Cases" do
puts "in module SO, RSpec sees describe Cases self=#{self}"
before(:each) do
puts ' in before(:all)'
end
cases.each do |case_|
puts " in each loop with case_=#{case_}"
it "Case #{case_}" do
puts " check spec for case #{case_}"
end
end
end
end
module M # to avoid "warning: class variable access from toplevel"
puts '>>>>> Ruby sees module M and executes/evaluates its body'
describe "M Cases" do
puts "in module M, RSpec sees describe Cases self=#{self}, ancestors :"
ancestors.each {|a| puts " #{a}"}
print 'self.methods.grep(/^it/) : '; p self.methods.grep(/^it/).sort
before(:all) do
puts " in before(:all) self=#{self}"
@@cases = [1,2,3]
puts " ... now cases=#{@@cases}"
File.open('generated_cases.rb', 'w') do |fgen|
fgen.puts 'puts "\n*** inside generated_cases.rb ***"'
fgen.puts 'module GenSpecs'
fgen.puts "puts '>>>>> Ruby sees module GenSpecs and executes/evaluates its body'"
fgen.puts ' describe "GenSpecs Cases" do'
fgen.puts ' puts "in module GenSpecs, RSpec sees describe Cases"'
@@cases.each do |case_|
puts " in each loop with case_=#{case_}"
fgen.puts <<-IT_SPECS
it "Case #{case_}" do
puts " some spec for case_=#{case_}"
end
IT_SPECS
end
fgen.puts ' end'
fgen.puts 'end # module GenSpecs'
fgen.puts "puts '>>>>> end of ruby file generated_cases.rb <<<<<'"
end
puts 'file generated_cases.rb has been closed'
require_relative 'generated_cases'
end
it 'has loaded Cases' do
@@cases.should_not be_empty
end
end
end
puts '>>>>> end of ruby file t2_spec.rb <<<<<'
Исполнение:
$ ruby -v
ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin12.2.0]
$ rspec --version
2.12.2
$ rspec --format nested t2_spec.rb
>>>>> Ruby sees module SO and executes/evaluates its body
in module SO, RSpec sees describe Cases self=#<Class:0x007fcaf49a6e80>
in each loop with case_=1
in each loop with case_=2
in each loop with case_=3
>>>>> Ruby sees module M and executes/evaluates its body
in module M, RSpec sees describe Cases self=#<Class:0x007fcaf2852e28>, ancestors :
#<Class:0x007fcaf2852e28>
RSpec::Core::ExampleGroup
...
self.methods.grep(/^it/) : [:it, :it_behaves_like, :it_should_behave_like, :its]
>>>>> end of ruby file t2_spec.rb <<<<<
SO Cases
in before(:all)
check spec for case 1
Case 1
in before(:all)
check spec for case 2
Case 2
in before(:all)
check spec for case 3
Case 3
M Cases
in before(:all) self=#<RSpec::Core::ExampleGroup::Nested_2:0x007fcaf2836ca0>
... now cases=[1, 2, 3]
in each loop with case_=1
in each loop with case_=2
in each loop with case_=3
file generated_cases.rb has been closed
*** inside generated_cases.rb ***
>>>>> Ruby sees module GenSpecs and executes/evaluates its body
in module GenSpecs, RSpec sees describe Cases
>>>>> end of ruby file generated_cases.rb <<<<<
has loaded Cases
GenSpecs Cases
some spec for case_=1
Case 1
some spec for case_=2
Case 2
some spec for case_=3
Case 3
Finished in 0.01699 seconds
7 examples, 0 failures
Создание файла и его требование для демонстрации и могут не работать в вашем случае. Я бы рекомендовал сделать это в два этапа: сначала вы читаете электронную таблицу и создаете файл .rb с примерами describe
и несколькими it
. На втором этапе вы запускаете Ruby для обработки сгенерированного файла.