Sono nuovo alla programmazione e ho imparato Ruby on Rails per circa 11 settimane.Factory factory di Factory Girl Devise non è valida - non supera il test RSpec
Quando si cerca di testare la mia fabbrica di utente per la convalida, ottengo
1) User has a valid factory
Failure/Error: expect(@user.valid?).to eq(true)
expected: true
got: false
(compared using ==)
sto usando Devise per il mio modello di utente, e factorygirl per le mie fabbriche.
Qui è la mia fabbrica di utente:
FactoryGirl.define do
factory :user do
name "John Fahey"
sequence(:email, 100) { |n| "person#{n}@example.com" }
password "password"
password_confirmation "password"
confirmed_at Time.now
end
end
... e qui è la mia spec
require 'rails_helper'
describe User do
before do
@user = build(:user)
end
it "has a valid factory" do
expect(@user.valid?).to eq(true)
end
end
Ho lavorato su come ottenere questo spec passare per un po 'di tempo. Per un po 'ho ricevuto l'errore "e-mail già presa" e l'ho superato. Ho persino avuto la spec per passare una volta, ma stavo usando la sintassi "dovrebbe essere" ora deprecata. Quando vado alla sintassi corretta ": expect" ottengo questo errore. Qualcuno ha un'idea di cosa sto facendo male qui?
Ecco il mio modello
class User < ActiveRecord::Base
#== schema information.
# create_table "users", force: true do |t|
# t.string "name"
# t.string "email", default: "", null: false
# t.string "encrypted_password", default: "", null: false
# t.string "reset_password_token"
# t.datetime "reset_password_sent_at"
# t.datetime "remember_created_at"
# t.integer "sign_in_count", default: 0, null: false
# t.datetime "current_sign_in_at"
# t.datetime "last_sign_in_at"
# t.string "current_sign_in_ip"
# t.string "last_sign_in_ip"
# t.string "confirmation_token"
# t.datetime "confirmed_at"
# t.datetime "confirmation_sent_at"
# t.string "unconfirmed_email"
# t.datetime "created_at"
# t.datetime "updated_at"
# end
# add_index "users", ["email"], name: "index_users_on_email", unique: true
# add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
has_one :list
has_many :items, through: :list
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
end
qui è quello che vedo quando creo un'istanza utente nella console rotaie e banco di prova per gli errori:
2.0.0-p576 :004 > @user = User.create
(0.2ms) begin transaction
(0.2ms) rollback transaction
=> #<User id: nil, name: nil, email: "", encrypted_password: "", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_coun
t: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, confirmation_token: nil, confirmed_at: nil, confirmation_sen
t_at: nil, unconfirmed_email: nil, created_at: nil, updated_at: nil>
2.0.0-p576 :005 > @user.save
(1.0ms) begin transaction
(0.1ms) rollback transaction
=> false
2.0.0-p576 :006 > puts(@user.errors)
#<ActiveModel::Errors:0xa7cff88>
=> nil
2.0.0-p576 :007 >
quando stampo i messaggi di errore, ho get
2.0.0-p576 :007 > puts(@user.errors.messages)
{:email=>["can't be blank"], :password=>["can't be blank"]}
=> nil
ecco qualcosa di interessante. Per sicurezza, ho fatto un rake db: migrate, e un rake db: test: preparare. Il test è passato. Poi ho fatto di nuovo il test esatto, e non è riuscito.
[email protected]:~/code/blocitoff$ rake db:migrate
[email protected]:~/code/blocitoff$ rake db:migrate
[email protected]:~/code/blocitoff$ rake db:test:prepare
[email protected]:~/code/blocitoff$ rspec spec/models/user_spec.rb
#<ActiveModel::Errors:0xbdf0740>
.
Finished in 0.1764 seconds (files took 8.96 seconds to load)
1 example, 0 failures
[email protected]:~/code/blocitoff$ rspec spec/models/user_spec.rb
#<ActiveModel::Errors:0xa97066c>
F
Failures:
1) User has a valid factory
Failure/Error: expect(@user.valid?).to eq(true)
expected: true
got: false
(compared using ==)
per favore pubblicare 'app/models/user.rb' con convalide. –
Senza vedere il tuo modello è difficile dirlo. Esegui il debug del motivo per cui si lamenta in "ha uno stabilimento valido", ad es. con: '@ user.errors' prima dell'asserzione. – blelump
Ok, ho aggiornato la mia domanda per includere il mio modello e le informazioni sullo schema. – EricLowber