2015-12-08 7 views
3

Я пытаюсь настроить RSpec и Shoulda-Matchers, но по какой-то причине, я получаю эту ошибку:NoMethodError: неопределенный метод `validate_presence_of» (Rspec и Shoulda-Matchers)

NoMethodError: undefined method `validate_presence_of' for #RSpec::ExampleGroups::AdCampaign::Validations:0x000000062a2b90>

Failure/Error: it { should have_many :advertisements } expected # to respond to has_many?

NoMethodError: undefined method `belong_to' for #RSpec::ExampleGroups::AdCampaign::Associations:0x0000000686d8e0>

Кажется, что я пробовал каждый ответ из stackoverflow и github проблем, и ничего не помогает.

Возможно, вы могли бы помочь мне узнать, что я делаю неправильно?

Вот мой 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 'rspec/rails' 
require 'shoulda/matchers' 
require 'spec_helper' 

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! 
end 

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

и вот мой spec_helper.rb:

ENV['RAILS_ENV'] ||= 'test' 

require File.expand_path('../../config/environment', __FILE__) 
require 'rspec/rails' 
require 'shoulda/matchers' 
require 'database_cleaner' 
require 'capybara/rspec' 

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } 

ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration) 

RSpec.configure do |config| 
    config.include Rails.application.routes.url_helpers 
    config.include FactoryGirl::Syntax::Methods 
    config.include(Shoulda::Matchers::ActiveModel, type: :model) 
    config.include(Shoulda::Matchers::ActiveRecord, type: :model) 
    # config.include Shoulda::Matchers::ActiveRecord, type: :model 
    # config.include Devise::TestHelpers, type: :controller 
    config.order = 'random' 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

    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 

Хир в файл спецификации с моим тестам:

require 'rails_helper' 

RSpec.describe AdCampaign, type: :model do 
    describe 'validations' do 
    it { should validate_presence_of :shop } 
    it { should validate_presence_of :description } 
    end 

    describe 'associations' do 
    it { should belong_to :shop } 
    it { should have_many :advertisements } 
    it { should have_one :recipient_list } 
    end 
end 

и вот модель, которую я пытаюсь для испытания:

class AdCampaign < ActiveRecord::Base 
    belongs_to :shop 
    has_many :advertisements 
    has_one :recipient_list 

    validates :shop, :description, presence: true 
end 

Я попытался размещения Shoulda::Matchers.configure do... в обоих rails_helper.rb и spec_helper.rb.

И в моем файле гем у меня есть shoulda-matchers камень, как это:

group :development, :test do 
    gem 'shoulda-matchers', require: false 
end 

Не могли бы вы мне помочь с настройкой Shoulda-matchers и RSpec? Что я здесь делаю неправильно?

+0

Вы пробовали удаление Shoulda-matchers из ': development' группы? –

+0

@HoangPhan да, не помогло, те же ошибки. Есть идеи? –

+0

Какие рельсы и рубин у вас есть эта проблема? –

ответ

6

У меня была схожая проблема! Я помогла этому:

# Gemfile 
group :test do 
    gem "shoulda-matchers", require: false 
end 

И это добавить к началу rspec_helper.rb

require 'shoulda-matchers' 

require "bundler/setup" 
::Bundler.require(:default, :test) 

::Shoulda::Matchers.configure do |config| 
    config.integrate do |with| 
    # Choose a test framework: 
    with.test_framework :rspec 
    #with.test_framework :minitest 
    #with.test_framework :minitest_4 
    #with.test_framework :test_unit 

    # Choose one or more libraries: 
    with.library :active_record 
    with.library :active_model 
    #with.library :action_controller 
    # Or, choose the following (which implies all of the above): 
    #with.library :rails 
    end 
end