Skip to content

Avoiding conflicts with shoulda-matchers #209

Open
@zedtux

Description

@zedtux

I have a Rails application composed of a mixture of ActiveRecord and Mongoid models.

I was able to write my unit tests until now the having configured my rails_helper.rb file has the following:

# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] = 'test'
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in #{Rails.env} mode!") unless Rails.env.test?
require 'rspec/rails'

# Add additional requires below this line. Rails is not loaded until this point!
require 'devise'

require_relative 'support/helpers'

# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
#
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.include Mongoid::Matchers, type: :model
  config.include Devise::TestHelpers, type: :controller
  config.include Helpers

  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = true

  # RSpec Rails can automatically mix in different behaviours to your tests
  # based on their file location, for example enabling you to call `get` and
  # `post` in specs under `spec/controllers`.
  #
  # You can disable this behaviour by removing the line below, and instead
  # explicitly tag your specs with their type, e.g.:
  #
  #     RSpec.describe UsersController, :type => :controller do
  #       # ...
  #     end
  #
  # The different available types are documented in the features, such as in
  # https://relishapp.com/rspec/rspec-rails/docs
  config.infer_spec_type_from_file_location!

  # Filter lines from Rails gems in backtraces.
  config.filter_rails_from_backtrace!
  # arbitrary gems may also be filtered via:
  # config.filter_gems_from_backtrace("gem name")

  config.before(:suite) do
    DatabaseCleaner[:active_record].strategy = :transaction
    DatabaseCleaner[:mongoid].strategy = :truncation
    DatabaseCleaner.clean_with(:truncation)
  end

  config.around(:each) do |example|
    DatabaseCleaner.cleaning do
      example.run
    end

    # Reset the operators table sequence in order to ensure created operator ID
    # will be 1 when creating one.
    # This is needed as the tests assumes the operator with ID 1 is the one
    # which is logged in.
    ActiveRecord::Base.connection.execute('ALTER TABLE operators AUTO_INCREMENT = 1')
  end
end

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

    # Choose one or more libraries:
    with.library :active_record
    with.library :action_controller
  end
end

But I have a conflict now that I want to use the validate_length_of matcher.

I have a spec file of an ActiveRecord model like this:

require 'rails_helper'

RSpec.describe MyModel, type: :model do
  describe 'Validations' do
    it { should validate_length_of(:name).is_at_most(255) }
  end
end

But it is failing with the following error:

  1) MyModel Validations
     Failure/Error: it { should validate_length_of(:name).is_at_most(255) }

     NoMethodError:
       undefined method `is_at_most' for #<Mongoid::Matchers::Validations::ValidateLengthOfMatcher:0x0000000bad3058>
     ...

Is there a way I can tell to RSpec this is a Mongoid model (type: :mongoid_model ?) which would load only the mongoid-rspec matchers?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions