Rails未能加载shoulda-matchers 3.1.1 gem,未定义的方法`allow_value'for#
'shoulda-matchers'gem在运行rspec测试时未加载。Rails未能加载shoulda-matchers 3.1.1 gem,未定义的方法`allow_value'for#<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
对不起,所有的代码。请注意我正在使用shoulda-matchers 3.1.1版本,并且不再需要在gemfile中添加'require:false'https://robots.thoughtbot.com/shoulda-matchers-3-0
我也曾尝试将gentfile中的shoulda-matchers添加到自己的测试环境中如下所示,但没有发现变化
group :test do
gem 'shoulda-matchers', '~> 3.1'
end
我在网上查找过,发现类似问题的解决方案不适用于我的情况。任何帮助或建议都会很棒!
,应该让你再次绿色的修复方法是:
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
在我的情况下,问题是,测试类不是一个ActiveRecord
项目,所以shoulda
没有加载的方法,如allow_value
默认。
的解决办法是在_spec.rb
文件中添加type: :model
:
RSpec.describe MyTestedClass, type: :model do
...
end
你设法解决您的问题? –