RSpec :: ExampleGroups :: User :: Validations的未定义方法`validate_presence_of’

我试图通过我的模型规范进行validation,但我无法让它们通过。 我已将所有validation规则放在我的模型文件中

应用程序/模型/ user.rb

class User  :friendships has_many :plans has_many :memberships, class_name: "PlanMemebership" has_many :notes has_many :replies, class_name: "NoteReply" has_many :upvotes, class_name: "NoteUpvote" validates :first_name, presence: true validates :last_name, presence: true validates :email, presence: true validates :facebook_user_id, presence: true, uniqueness: true validates :facebook_user_token, presence: true, uniqueness: true validates :token, presence: true, uniqueness: true validates :birthday, presence: true validates :gender, presence: true def name first_name + " " + last_name end end 

规格/型号/ user_spec.rb

 require 'rails_helper' describe User, :type => :model do context "valid Factory" do it "has a valid factory" do expect(FactoryGirl.build(:user)).to be_valid end end context "validations" do it { should validate_presence_of :first_name } it { should validate_presence_of :last_name } it { should validate_presence_of :email } it { should validate_presence_of :birthday } it { should validate_presence_of :gender } it { should validate_presence_of :facebook_user_id } it { should validate_presence_of :facebook_user_token } context "uniqueness" do before { create(:user) } it { should validate_uniqueness_of :facebook_user_id } it { should validate_uniqueness_of :facebook_user_token } it { should validate_uniqueness_of :token } end end end 

规格/工厂/ users.rb的

 FactoryGirl.define do sequence(:facebook_id) { |n| "#{n}1004453333331" } sequence(:facebook_user_token) { |n| "#{n}CAA" + ("X" * 216) } factory :user do first_name "Ralph" last_name "Robot" email "ralph@thoughtbot.com" facebook_user_id { generate(:facebook_id) } facebook_user_token birthday { Date.current } gender "Male" token { Token.new.generate } end end 

测试输出

 Token #generate returns a 20-byte token User valid Factory has a valid factory validations example at ./spec/models/user_spec.rb:13 (FAILED - 1) example at ./spec/models/user_spec.rb:14 (FAILED - 2) example at ./spec/models/user_spec.rb:15 (FAILED - 3) example at ./spec/models/user_spec.rb:16 (FAILED - 4) example at ./spec/models/user_spec.rb:17 (FAILED - 5) example at ./spec/models/user_spec.rb:18 (FAILED - 6) example at ./spec/models/user_spec.rb:19 (FAILED - 7) uniqueness example at ./spec/models/user_spec.rb:23 (FAILED - 8) example at ./spec/models/user_spec.rb:24 (FAILED - 9) example at ./spec/models/user_spec.rb:25 (FAILED - 10) Failures: 1) User validations Failure/Error: it { should validate_presence_of :first_name } NoMethodError: undefined method `validate_presence_of' for # # ./spec/models/user_spec.rb:13:in `block (3 levels) in ' 2) User validations Failure/Error: it { should validate_presence_of :last_name } NoMethodError: undefined method `validate_presence_of' for # # ./spec/models/user_spec.rb:14:in `block (3 levels) in ' 3) User validations Failure/Error: it { should validate_presence_of :email } NoMethodError: undefined method `validate_presence_of' for # # ./spec/models/user_spec.rb:15:in `block (3 levels) in ' 4) User validations Failure/Error: it { should validate_presence_of :birthday } NoMethodError: undefined method `validate_presence_of' for # # ./spec/models/user_spec.rb:16:in `block (3 levels) in ' 5) User validations Failure/Error: it { should validate_presence_of :gender } NoMethodError: undefined method `validate_presence_of' for # # ./spec/models/user_spec.rb:17:in `block (3 levels) in ' 6) User validations Failure/Error: it { should validate_presence_of :facebook_user_id } NoMethodError: undefined method `validate_presence_of' for # # ./spec/models/user_spec.rb:18:in `block (3 levels) in ' 7) User validations Failure/Error: it { should validate_presence_of :facebook_user_token } NoMethodError: undefined method `validate_presence_of' for # # ./spec/models/user_spec.rb:19:in `block (3 levels) in ' 8) User validations uniqueness Failure/Error: before { create(:user) } ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_email" DETAIL: Key (email)=(ralph@thoughtbot.com) already exists. : INSERT INTO "users" ("first_name", "last_name", "email", "facebook_user_id", "facebook_user_token", "birthday", "gender", "token", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id" # ./spec/models/user_spec.rb:22:in `block (4 levels) in ' 9) User validations uniqueness Failure/Error: before { create(:user) } ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_email" DETAIL: Key (email)=(ralph@thoughtbot.com) already exists. : INSERT INTO "users" ("first_name", "last_name", "email", "facebook_user_id", "facebook_user_token", "birthday", "gender", "token", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id" # ./spec/models/user_spec.rb:22:in `block (4 levels) in ' 10) User validations uniqueness Failure/Error: before { create(:user) } ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_email" DETAIL: Key (email)=(ralph@thoughtbot.com) already exists. : INSERT INTO "users" ("first_name", "last_name", "email", "facebook_user_id", "facebook_user_token", "birthday", "gender", "token", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id" # ./spec/models/user_spec.rb:22:in `block (4 levels) in ' Finished in 0.13486 seconds (files took 3.99 seconds to load) 12 examples, 10 failures Failed examples: rspec ./spec/models/user_spec.rb:13 # User validations rspec ./spec/models/user_spec.rb:14 # User validations rspec ./spec/models/user_spec.rb:15 # User validations rspec ./spec/models/user_spec.rb:16 # User validations rspec ./spec/models/user_spec.rb:17 # User validations rspec ./spec/models/user_spec.rb:18 # User validations rspec ./spec/models/user_spec.rb:19 # User validations rspec ./spec/models/user_spec.rb:23 # User validations uniqueness rspec ./spec/models/user_spec.rb:24 # User validations uniqueness rspec ./spec/models/user_spec.rb:25 # User validations uniqueness 

我认为您需要将以下内容添加到spec_helper.rb中

 require 'shoulda/matchers' 

如果匹配器的方法丢失了您的规格。

这是来源。 你可以查一下。 人们抱怨类似的事情。 https://github.com/thoughtbot/shoulda-matchers/issues/384

Gemfile添加rspec-railsshoulda-matchers

 group :development, :test do gem 'rspec-rails', '~> 3.4', '>= 3.4.2' gem 'shoulda-matchers', '~> 3.1', '>= 3.1.1' end 

设置spec/rails_helper.rb以使用rspec-railsshoulda-matchers

 require 'rspec/rails' require 'shoulda/matchers' 

并添加您的spec/spec_helper.rb

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