Rspec NoMethodError: undefined method `errors_on'
Ich bin Tests für die Validierung der Eingabe einer Stadt-Attribut in einem Adressen-Modell. Mein Modell-Spezifikation ist wie folgt
require 'rails_helper'
RSpec.describe Address, :type => :model do
before(:each) do
@valid_attributes = {
street: 'rock avenue',
city: 'MSA',
zip: '00100',
person_id: 1
} # runs before each it block
end
context "Validations" do
it 'must have a city' do
a = Address.new
expect(a.errors_on(:city)).not_to be_empty
end
end
end
Wenn ich die spec, bekomme ich die folgende Fehlermeldung
1) Address Validations must have a city
Failure/Error: expect(a.errors_on(:city)).not_to be_empty
NoMethodError:
undefined method `errors_on' for #<Address:0xd844538>
# ./spec/models/address_spec.rb:19:in `block (3 levels) in <top (required)>'
Meinem test-Edelsteine werden eingerichtet wie folgt in meinem Gemfile
group :development, :test do
gem 'rspec-rails'
gem 'factory_girl_rails', :require => false
end
group :test do
gem 'capybara'
gem 'guard'
gem 'guard-rspec'
gem 'libnotify'
gem 'rspec-collection_matchers'
end
Ich habe die rspec-Sammlung Matcher in meinem spec_helper, so verstehe ich nicht, warum ich immer diese Fehlermeldung
Meine spec_helper.rb
require 'capybara/rspec'
require 'factory_girl_rails'
require 'rspec/collection_matchers'
Kann ich jedoch sehen, dass die Methode, errors_on definiert wurde, in rspec-collection_matchers Edelstein-wie dargestellt hier
Meine .rspec
--color
--require spec_helper
Habe ich auch geändert die position der
require 'rspec/collection_matchers'
zu rails_helper.rb, aber das ausführen der test-suite wieder den gleichen Fehler
rails_helper.rb
ENV["RAILS_ENV"] ||= 'test'
require 'rspec/collection_matchers'
require 'capybara/rspec'
require 'factory_girl_rails'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!
RSpec.configure do |config|
config.include Capybara::DSL
config.include FactoryGirl::Syntax::Methods
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
end
Meine spec_helper.rb ist leer, nur der block unten:
RSpec.configure do |config|
end
Ich bin mit Rails 4.1.0, rspec 3.0.0-und rspec-collection_matchers 1.0.0
- Deine Skillung erfordert
rails_helper
, aber Sie setzen dierequire 'rspec/collection_matchers'
Linie inspec_helper
- Ist Ihrenrails_helper
- Datei require 'spec_helper'? - ja, meine rails_helper.rb Datei erfordert spec_helper
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ohne zu sehen, das repo, das ist nur eine Vermutung, basierend auf den Informationen. Ich denke, das ist eine Last-order-problem.
Sieht es aus wie Sie be -
rspec/collection_matchers
imspec_helper
, nichtrails_helper
. Wenn Sie mit dem neuen Standard-Konfiguration--require spec_helper
ist in Ihrem.rspec
- Datei. Wenn Sie ausführen, rspec dies erfordertspec_helper
sehr früh auf. Wenn das passiert, es erfordertrspec/collection_matchers
. Jedoch, an diesem Punktrails_helper
noch nicht geladen wurde. Leider bedeutet dies auch die meistenActiveSupport
einschließlichActiveModel
sind noch nicht geladen. Es bedeutet auch, die Schienen autoloading-Funktionalität ist nicht geladen worden, so dass diejenigen, die nicht bekommen wird definiert, wenn Sie zu referenzieren.All dies zu sagen, ist der check für
ActiveModel
hier zurückfalse
. Die nicht ladenerrors_on
.Versuchen Sie, das verlangen in
rails_helper
.Hinweis auf den Test in isolation:
Wenn Sie sich für eine schnellere Prüfung in der isolation ist dies mein Vorschlag:
spec_helper
gehalten werden sollte, sehr gering und leicht, das bedeutet, dass für die meisten Teil, den Sie shouldn ' T fügen Sie keinerequire
Erklärungen zuBewegen, die erfordert, dass Sie sind, aus
spec_helper
inrails_helper
sind diejenigen, die meist Rails-spezifisch und gehören nicht inspec_helper
als Rails wird nicht geladen, esWenn Sie benötigen Zugriff auf die anderen
rspec/collection_matchers
Funktionalität in specs die nicht erfordern Schienen, dann fügen Sie einfach dierequire 'rspec/collection_matchers'
an die Spitze der spec-Datei; Ruby wird Griff, so dass Sie sicher, es wird nur einmal geladen,require 'rspec/rails'