ruby on rails - tutorial - método undefined `validate_presence_of ''para RSpec:: ExampleGroups:: User:: Validations
selenium rails (2)
Agrega rspec-rails
y shoulda-matchers
en tu Gemfile
:
group :development, :test do
gem ''rspec-rails'', ''~> 3.4'', ''>= 3.4.2''
gem ''shoulda-matchers'', ''~> 3.1'', ''>= 3.1.1''
end
Establezca su spec/rails_helper.rb
para usar rspec-rails
y shoulda-matchers
:
require ''rspec/rails''
require ''shoulda/matchers''
Y agregue su spec/spec_helper.rb
:
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end
Estoy intentando pasar mis especificaciones del modelo para la validación pero no puedo hacer que pasen. He colocado todas las reglas de validación en mi archivo de modelo también
app / model / user.rb
class User < ActiveRecord::Base
has_many :friendships
has_many :friends, :through => :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
especificaciones / modelos / 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
spec / factories / 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 "[email protected]"
facebook_user_id { generate(:facebook_id) }
facebook_user_token
birthday { Date.current }
gender "Male"
token { Token.new.generate }
end
end
Salida de prueba
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 #<RSpec::ExampleGroups::User::Validations:0x007fc255f7fb88>
# ./spec/models/user_spec.rb:13:in `block (3 levels) in <top (required)>''
2) User validations
Failure/Error: it { should validate_presence_of :last_name }
NoMethodError:
undefined method `validate_presence_of'' for #<RSpec::ExampleGroups::User::Validations:0x007fc255e9fad8>
# ./spec/models/user_spec.rb:14:in `block (3 levels) in <top (required)>''
3) User validations
Failure/Error: it { should validate_presence_of :email }
NoMethodError:
undefined method `validate_presence_of'' for #<RSpec::ExampleGroups::User::Validations:0x007fc255ded568>
# ./spec/models/user_spec.rb:15:in `block (3 levels) in <top (required)>''
4) User validations
Failure/Error: it { should validate_presence_of :birthday }
NoMethodError:
undefined method `validate_presence_of'' for #<RSpec::ExampleGroups::User::Validations:0x007fc255d65398>
# ./spec/models/user_spec.rb:16:in `block (3 levels) in <top (required)>''
5) User validations
Failure/Error: it { should validate_presence_of :gender }
NoMethodError:
undefined method `validate_presence_of'' for #<RSpec::ExampleGroups::User::Validations:0x007fc255cb7888>
# ./spec/models/user_spec.rb:17:in `block (3 levels) in <top (required)>''
6) User validations
Failure/Error: it { should validate_presence_of :facebook_user_id }
NoMethodError:
undefined method `validate_presence_of'' for #<RSpec::ExampleGroups::User::Validations:0x007fc255c356f8>
# ./spec/models/user_spec.rb:18:in `block (3 levels) in <top (required)>''
7) User validations
Failure/Error: it { should validate_presence_of :facebook_user_token }
NoMethodError:
undefined method `validate_presence_of'' for #<RSpec::ExampleGroups::User::Validations:0x007fc255b86a40>
# ./spec/models/user_spec.rb:19:in `block (3 levels) in <top (required)>''
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)=([email protected]) 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 <top (required)>''
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)=([email protected]) 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 <top (required)>''
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)=([email protected]) 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 <top (required)>''
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
Creo que debes agregar lo siguiente a tu spec_helper.rb
require ''shoulda/matchers''
Sus especificaciones están perdiendo los métodos de shoulda matcher.
Aquí está la fuente. Puedes comprobar. La gente se queja cosas similares. https://github.com/thoughtbot/shoulda-matchers/issues/384