Должны-сопоставители не видны rails/rspec

Rails 4.2.4, Rspec 3.3.1, shoulda-matchers 3.0.0.

я осознаю

  #...
  358) Participant validations 
       Failure/Error: it { should ensure_length_of(:coresp_country).is_at_most(255) }
       NoMethodError:
         undefined method `ensure_length_of' for #<RSpec::ExampleGroups::Participant::Validations:0x0000000f40aec0>
       # ./spec/models/participant_spec.rb:100:in `block (3 levels) in <top (required)>'

  359) Participant validations company 
       Failure/Error: it { should ensure_length_of(:company).is_at_most(255) }
       NoMethodError:
         undefined method `ensure_length_of' for #<RSpec::ExampleGroups::Participant::Validations::Company:0x0000000f414ab0>
       # ./spec/models/participant_spec.rb:149:in `block (4 levels) in <top (required)>'

  360) Participant validations company declared_type = COMPANY 
       Failure/Error: it { should validate_presence_of(:company) }
       NoMethodError:
         undefined method `validate_presence_of' for #<RSpec::ExampleGroups::Participant::Validations::Company::DeclaredTypeCOMPANY:0x0000000f429c58>
   #...

И еще много подобных сбоев (похоже, не работают shoulda-matchers).

rails_helper.rb:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'spec_helper'
require 'rspec/rails'
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

Rails.logger.level = 4

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!

  config.include FactoryGirl::Syntax::Methods
  config.include Sorcery::TestHelpers::Rails
  config.include Macros::Controller::Security
end
FactoryGirl.reload
Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec
    with.library :rails
  end
end

spec_helper.rb:

require 'simplecov_helper'
require 'webmock/rspec'
WebMock.disable_net_connect!(allow_localhost: true)
require 'rspec/collection_matchers'

RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end
  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
  config.filter_run :focus
  config.run_all_when_everything_filtered = true
  config.disable_monkey_patching!
  config.expose_dsl_globally = true
  config.default_formatter = 'doc' if config.files_to_run.one?
  config.order = :random

  Kernel.srand config.seed
end

РЕДАКТИРОВАТЬ

Хорошо, я думаю, что проблема не в совпадениях, а в геме active_attr, потому что тесты только терпят неудачу в папке spec/compositions/api, где я использую гем.


person Andrey Deineko    schedule 22.10.2015    source источник
comment
Извините, что затронул самый очевидный случай, но требуется ли rails_helper.rb в данных спецификациях? Возможно, вам случайно потребовался spec_helper.rb   -  person jfornoff    schedule 23.10.2015
comment
rails_helper.rb требуется :)   -  person Andrey Deineko    schedule 23.10.2015
comment
Хорошо, следующая контрольная точка: нет require: false в драгоценном камне «shoulda-matchers»? ;-)   -  person jfornoff    schedule 23.10.2015
comment
когда require: false я получаю uninitialized constant Shoulda (NameError) , указывающий на Shoulda::Matchers.configure строку в rails_helper.rb   -  person Andrey Deineko    schedule 23.10.2015
comment
Это имеет смысл, просто хотел убедиться, что require: false НЕ существует, некоторые учебники предлагают вам сделать это, а затем потребовать его вручную. Я не совсем уверен, как там работает механика require для связанных драгоценных камней, но я думаю, что важно, чтобы у вас был драгоценный камень «shoulda-matchers» в тестовой группе в вашем Gemfile, это тоже проверено?   -  person jfornoff    schedule 23.10.2015
comment
да, в test группе   -  person Andrey Deineko    schedule 23.10.2015
comment
Это тяжело. Наши настройки почти идентичны, попробуйте закомментировать disable_monkey_patching, может быть, я мог предположить, что мыслеботы обезьяны что-то пропатчили, и это сломает это.   -  person jfornoff    schedule 23.10.2015
comment
попробовал этот (должен был изменить describe на RSpec.describe) - к сожалению, не повезло..   -  person Andrey Deineko    schedule 23.10.2015
comment
Хорошо, это мой последний выстрел, идеи почти закончились. Вы можете потребовать: false для драгоценного камня в Gemfile и потребовать «shoulda/matchers» в вашем файле rails_helper.rb (после rspec/rails). Также не используется предварительный загрузчик приложений, такой как spring/spork, верно?   -  person jfornoff    schedule 23.10.2015
comment
Я пробовал это раньше, но попробую еще раз, и да, пружина/спорк не задействованы.   -  person Andrey Deineko    schedule 23.10.2015


Ответы (1)


shoulda-matchers 3.0 выборочно делает доступными свои сопоставители. Я использую сопоставители ActiveModel, которые смешиваются только со спецификациями модели (af98a23).

У меня было два варианта решения проблемы:

  • размещение спецификаций моделей, использующих гем active_attr, в папку spec/models;
  • добавление type: :model в блок описания верхнего уровня для каждого класса в папке spec/compositions/api.

Я решил пойти по второму варианту, и это сработало.


Примечание

Теперь сопоставители, начинающиеся с обеспечения (ensure_inclusion_in, ensure_length_of), переименованы в validate_inclusion_in, validate_length_of (55c8d09< /а>).

person Andrey Deineko    schedule 25.10.2015
comment
Спасибо за это (особенно за примечание). Спас мое здравомыслие - person Jay Dorsey; 08.12.2015
comment
@JayDorsey Я помню, что собирался потерять свою, когда, наконец, разобрался: D Рад, что это полезно для кого-то, кроме меня! - person Andrey Deineko; 08.12.2015