После просмотра выступления Fasts Rails выступления Кори и чтения Объекта на Rails Avdi Я нахожусь в процессе настройки моего нового приложения Rails 3.2, чтобы воспользоваться концепции.
Чтобы все заработало, я начал с этого примера файла спецификации.
# spec_no_rails/projects/financials_spec.rb
require_relative '../spec_no_rails_helper'
class DummyProject
include Modules::Projects::Financials
end
describe Modules::Projects::Financials do
it 'should have some method' do
DummyProject.new.foo.should == 'bar'
end
end
И это был начальный файл spec_no_rails_helper.rb, который используется для запроса модулей
# spec_no_rails/spec_no_rails_helper.rb
Dir["#{Dir.pwd}/app/pimms/**/*.rb"].each { |file| require file }
Затем я приступил к созданию нового примера модуля.
# app/pimms/modules/projects/financials.rb
module Modules::Projects::Financials
def foo
'bar'
end
end
Чтобы увидеть, что все будет работать, когда я включил новый автономный модуль в один из моих классов ActiveRecord, я добавил следующую строку в одну из моих моделей.
# app/models/project.rb
class Project < ActiveRecord::Base
include Modules::Projects::Financials
end
Это позволило мне открыть консоль и увидеть, что все работает как положено.
> Project.first.foo
=> "bar"
Итак, на этом этапе я определил автономный модуль пространства имен, определенный в app / pimms / modules / projects / financials.rb, который я могу включить в модель Rails, и все работает как положено.
Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь запустить спецификации, я получаю следующее.
> bundle exec rspec spec_no_rails/
/Users/scott/Code/pimms/spec_no_rails/projects/financials_spec.rb:5:in `<class:DummyProject>': uninitialized constant DummyProject::Modules (NameError)
from /Users/scott/Code/pimms/spec_no_rails/projects/financials_spec.rb:4:in `<top (required)>'
from /Users/scott/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `load'
from /Users/scott/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `block in load_spec_files'
from /Users/scott/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `map'
from /Users/scott/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `load_spec_files'
from /Users/scott/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:22:in `run'
from /Users/scott/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:80:in `run_in_process'
from /Users/scott/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:69:in `run'
from /Users/scott/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:10:in `block in autorun'
Таким образом, причина этого в том, что пространства имен Modules :: Projects не были определены во время выполнения тестов. Я предполагаю, что мне не нужно было определять пространство имен Modules :: Projects, когда я использовал модуль с приложением Rails, потому что Rails обработал это для меня.
Чтобы тест выполнялся должным образом, мне нужно было определить пространство имен в файле spec_no_rails_helper.rb следующим образом.
# spec_no_rails/spec_no_rails_helper.rb
module Modules
module Projects
end
end
Dir["#{Dir.pwd}/app/pimms/**/*.rb"].each { |file| require file }
Это, очевидно, не идеально, поскольку мне пришлось бы вручную создавать все пространства имен для любых автономных модулей или классов, которые я не тестировал вне Rails.
Есть ли лучший способ настроить приложение Rails, чтобы я мог легко запускать набор тестов, не полагаясь на Rails?