Автотест не работает с общими примерами rspec

Мои тесты выглядят так:

<<< spec/models/user_shared.rb

shared_examples_for "a user" do
end

<<< spec/models/worker_spec.rb

require 'spec_helper'
require 'models/user_shared'

describe Worker do
  it_behaves_like "a user"
end

я могу бежать rspec spec успешно. Но autotest терпит неудачу:

Exception encountered: #<ArgumentError: Shared example group 'a user' already exists>

Это потому, что командная строка rspec, сгенерированная autotest включает в себя user_shared.rb:

/usr/local/rvm/rubies/ruby-1.9.2-p290/bin/ruby -rrubygems -S /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/bin/rspec --tty [...] '/path/to/project/spec/models/worker_spec.rb' '/path/to/project/spec/models/user_shared.rb'
Running tests with args ["--color", "--tty", [...], "/path/to/project/spec/models/worker_spec.rb", "/path/to/project/spec/models/user_shared.rb"]...
Done.

Exception encountered: #<ArgumentError: Shared example group 'a user' already exists>

Когда я удаляю '/path/to/project/spec/models/user_shared.rb' из командной строки и выполнить его вручную, это работает.

Теперь, если я поменяю user_shared.rb к этому:

<<< spec/models/user_shared.rb

if !@included then
  @included = true
  shared_examples_for "a user" do
  end
end

он работает с командной строкой, сгенерированной autotest, тоже. Но это уродливый обходной путь.

поскольку rspec знает только "*_spec" файлы являются яичками, как можно autotest быть настроен так?

В моем Gemfile у меня есть следующее (относящееся к тестированию):

<<<< Gemfile

gem 'autotest'
gem 'autotest-rails'

group :test do
  gem 'rspec-rails', '>= 2.6.1'
  gem 'shoulda-matchers'
  gem 'factory_girl_rails', '>= 1.0.2'
  gem 'capybara', '>= 1.0.0'
  gem 'cucumber-rails', '>= 1.0.2'
  gem 'database_cleaner', '>= 0.6.7'
  gem 'spork', '>= 0.9.0.rc'
end

1 ответ

Решение

Получил сам... реорганизация структуры папок.

  • создал новую папку spec/shared/ и переместил туда все примеры
  • удалены любые require *_shared.rb из моих примеров
  • добавленной Dir[Rails.root.join("spec/shared/**/*.rb")].each {|f| require f} в spec_helper.rb
  • подправлен автотест:

,

<<< .autotest

  at.add_mapping(%r%^spec/shared/.*rb%) { |_, _|
    Dir['spec/**/*_spec.rb'] # could be tweaked to just run tests that have this example
                             # but for now I don't care - just run all tests
  }
Другие вопросы по тегам