2016-04-27 4 views
0

Драгоценный камень« musta-matchers »не загружается при запуске тестов rspec.Рельсы сбой при загрузке musta-matchers 3.1.1 gem, неопределенный метод `allow_value 'для # <RSpec

Ошибка: NoMethodError: undefined method 'allow_value' for #<RSpec::ExampleGroups::Contact::ActiveModelValidationss:0x007fef1021b310>

версии используются: Ruby 2.2.2 Rails 4.2.1 shoulda-matchers 3.1.1

Gemfile:

source 'https://rubygems.org' 

gem 'rails', '4.2.1' 
gem 'sqlite3' 
gem 'sass-rails', '~> 5.0' 
gem 'uglifier', '>= 1.3.0' 
gem 'coffee-rails', '~> 4.1.0' 
gem 'jquery-rails' 
gem 'turbolinks' 
gem 'jbuilder', '~> 2.0' 
gem 'sdoc', '~> 0.4.0', group: :doc 

group :development, :test do 
    gem 'byebug' 
    gem 'rspec-rails', '~> 3.0' 
    gem 'factory_girl_rails' 
    gem 'shoulda-matchers', '~> 3.1' 
    gem 'web-console', '~> 2.0' 
    gem 'spring' 
    gem 'rubocop', require: false 
end 

rails_helper.rb:

ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 
abort("The Rails environment is running in production mode!") if Rails.env.production? 
require 'spec_helper' 
require 'rspec/rails' 

ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 
    config.use_transactional_fixtures = true 
    config.infer_spec_type_from_file_location! 
    config.filter_rails_from_backtrace! 

    Shoulda::Matchers.configure do |config| 
    config.integrate do |with| 
     with.test_framework :rspec 
     with.library :active_record 
     with.library :rails 
    end 
    end 
end 

spec_helper.rb:

RSpec.configure do |config| 
    require 'factory_girl_rails' 
    require 'shoulda/matchers' 
    config.include FactoryGirl::Syntax::Methods 
    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 
end 

contact_spec.rb:

require 'spec_helper' 

describe Contact do 

    FactoryGirl.define do 
    factory :contact do 
     first_name "Alice" 
     last_name "Bob" 
     email_address "[email protected]" 
     phone_number "555-555-5555" 
     company_name "ExampleCompany" 
    end 
    end 

    it "has a valid factory" do 
    expect(build(:contact)).to be_valid 
    end 

    describe "ActiveModel validations" do 
    it { expect(:contact).to allow_value("[email protected]").for(:email_address) } 
    end 
end 

Извините за весь код. Обратите внимание, что я использую toa-matchers версии 3.1.1 и добавление «require: false» в gemfile больше не требуется, как указано здесь. https://robots.thoughtbot.com/shoulda-matchers-3-0

Я также попробовал добавить в свою тестовую среду в Gemfile как показано ниже, но не нашел никаких изменений

group :test do 
    gem 'shoulda-matchers', '~> 3.1' 
end 

Я посмотрел в Интернете и нашел похожие проблемы с решениями, которые не работают в моем случае. Любая помощь или совет были бы замечательными!

+0

вам удалось решить проблему? –

ответ

0

исправление, вы должны получить зеленый снова изменить:

it { expect(:contact).to allow_value("[email protected]").for(:email_address) }

в

it { expect(build(:contact)).to allow_value("[email protected]").for(:email_address) }

точно так же, как ваш первый тест, так как ваш второй тест ожидает символ :contact - allow_value, а не объект, созданный на вашем заводе.

Кроме того, я рекомендовал бы двигаться ваше определение фабрики в свой собственный файл под spec/factories/contact.rb вместо встроенного в вашей спецификации, и memoise объект контакта в методе let, так что вы бы спецификацию, которая выглядит как:

require 'spec_helper' 

describe Contact do 
    let(:contact) { build(:contact) } 

    it "has a valid factory" do 
    expect(contact).to be_valid 
    end 

    describe "ActiveModel validations" do 
    it { expect(contact).to allow_value("[email protected]").for(:email_address) } 
    end 
end 
0

В моем случае проблема в том, что тестируемый класс не был ActiveRecord деталь, поэтому shoulda не сработал такие методы, как allow_value по умолчанию.

Решение было добавить type: :model в _spec.rb файле:

RSpec.describe MyTestedClass, type: :model do 
    ... 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^