RoR rspec test en échec avec l'erreur " le bloc (2 niveaux) dans <top (requis)>
Je suis Hartls Rails tutoriel et je suis bloqué à la fin du Chapitre 6.
Soudain, certains de mes tests ont échoué avec le même message d'erreur:
C:\Users\JMA\Projekte\sampleapp>bundle exec rspec spec/
.F......F...FFF....
Failures:
1) User
Failure/Error: it { should respond_to(:passwors_confirmation)}
expected #<User id: nil, name: "Example User", email: "[email protected]",
created_at: nil, updated_at: nil, password_digest: "$2a$04$OMnlZgC9yWhxbQizs8MG
9uPMCd8LmMlO5MZzkuQyM8it..."> to respond to :passwors_confirmation
# ./spec/models/user_spec.rb:16:in `block (2 levels) in <top (required)>'
2) User when name is not present when email format is valid should be valid
Failure/Error: expect(@user).to be_valid
expected #<User id: nil, name: " ", email: "[email protected]", created_at: ni
l, updated_at: nil, password_digest: "$2a$04$PtGxi4DjJWFezLFYy1jW5eaI7C/xxyBLXAG
zPepflo8r..."> to be valid, but got errors: Name can't be blank
# ./spec/models/user_spec.rb:51:in `block (5 levels) in <top (required)>'
# ./spec/models/user_spec.rb:49:in `each'
# ./spec/models/user_spec.rb:49:in `block (4 levels) in <top (required)>'
3) User when name is not present return value of authenticate method with vali
d password
Failure/Error: before { @user.safe }
NoMethodError:
undefined method `safe' for #<User:0x502bc30>
# ./spec/models/user_spec.rb:86:in `block (4 levels) in <top (required)>'
4) User when name is not present return value of authenticate method with inva
lid password
Failure/Error: before { @user.safe }
NoMethodError:
undefined method `safe' for #<User:0x50333a0>
# ./spec/models/user_spec.rb:86:in `block (4 levels) in <top (required)>'
5) User when name is not present return value of authenticate method with inva
lid password
Failure/Error: before { @user.safe }
NoMethodError:
undefined method `safe' for #<User:0x503b848>
# ./spec/models/user_spec.rb:86:in `block (4 levels) in <top (required)>'
Finished in 0.52003 seconds
19 examples, 5 failures
Failed examples:
rspec ./spec/models/user_spec.rb:16 # User
rspec ./spec/models/user_spec.rb:47 # User when name is not present when email f
ormat is valid should be valid
rspec ./spec/models/user_spec.rb:90 # User when name is not present return value
of authenticate method with valid password
rspec ./spec/models/user_spec.rb:96 # User when name is not present return value
of authenticate method with invalid password
rspec ./spec/models/user_spec.rb:97 # User when name is not present return value
of authenticate method with invalid password
Randomized with seed 37132
Mon user_specs.rb ressemble à ceci:
require 'spec_helper'
describe User do
before do
@user = User.new(name: "Example User", email: "[email protected]",
password: "foobar", password_confirmation: "foobar")
end
subject { @user }
it { should respond_to(:name) }
it { should respond_to(:email) }
it { should respond_to(:password_digest) }
it { should respond_to(:password) }
it { should respond_to(:passwors_confirmation)}
it { should be_valid }
describe"when name is not present" do
before { @user.name = " " }
it { should_not be_valid}
describe "when email is not present" do
before { @user.email = " " }
it { should_not be_valid}
end
describe "when name is to long" do
before { @user.name = "a" * 51 }
it { should_not be_valid}
end
describe "when email format is invalid" do
it "should be invalid" do
adresses = %w[user@foo,com user_at_foo.org example.user@foo.
foo@bar_baz.com foo@bar+baz.com]
adresses.each do |invalid_adress|
@user.email = invalid_adress
expect(@user).not_to be_valid
end
end
end
describe "when email format is valid" do
it "should be valid" do
addresses = %w[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn]
addresses.each do |valid_address|
@user.email = valid_address
expect(@user).to be_valid
end
end
end
describe "when email adress is already taken" do
before do
user_with_same_email = @user.dup
user_with_same_email.email = @user.email.upcase
user_with_same_email.save
end
it {should_not be_valid}
end
it { should respond_to(:authenticate) }
describe "when password is not present" do
before do
@user = User.new(name: "Example User", email: "[email protected]",
password: " ", password_confirmation: " ")
end
it { should_not be_valid }
end
describe "when password doesn't match confirmation" do
before { @user.password_confirmation = "mismatch" }
it { should_not be_valid }
end
describe "with a password that's to short" do
before { @user.password = @user.password_confirmation = "a" * 5 }
it { should be_invalid }
end
describe "return value of authenticate method" do
before { @user.safe }
let(:found_user) { User.find_by(email: @user.email) }
describe "with valid password" do
it { should eq found_user.authenticate(@user.password) }
end
describe "with invalid password" do
let (:user_for_inavlid_password) { found_user.authenticate("invalid") }
it { should_not eq user_for_inavlid_password }
specify { expect(user_for_inavlid_password).to be_false }
end
end
end
end
utilisateurs.rb
class User < ActiveRecord::Base
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence:true, format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :password, length: { minimum: 6 }
end
Il est apparu après l'ajout du mot de passe et password_confirmation attributs de l'Utilisateur du modèle. La où le passage jusqu'alors. J'ai continué le tuto parce que j'ai lu à propos de cet échec, et qu'elle sera traitée au plus tard dans le tutoriel. Maintenant, mes tests sont toujours pas et je ne sais pas pourquoi. Des idées?
- Pourquoi ne montrez-vous pas l'erreur, de sorte que les gens peuvent vous aider à corriger l'erreur? Afficher toutes les lignes du message d'erreur, et pas seulement les quelques premiers mots.
- Désolé, c'était ma première fois de poser une question ici. J'ai ajouté le message d'erreur complet. Reconnaissant de votre aide.
Vous devez vous connecter pour publier un commentaire.
La trace de la pile dit:
C'est vous dire quelques informations clés:
user_spec.rb
.before { @user.safe }
.NoMethodError
ce qui signifie que vous essayez d'appeler une méthode sur un objet pour lequel cette méthode n'est pas définie.safe
pour#<User:0x503b848>
qui est une instance de laUser
classe. D'après le contexte, vous devriez être en mesure de déduire que c'est en se référant à la@user
variable dans ce contexte.C'est façon plus de suffisamment d'informations pour en déduire ce que cause du problème est: vous appelez
@user.safe
sur la ligne 86, et il n'y a pas une telle méthodesafe
pour@user
.La solution le problème est que vous avez sans doute dire d'appeler
save
, passafe
.Vous avez quelques autres défaillances pour un couple d'autres raisons. Voir si vous pouvez lire les informations contenues dans les messages d'erreur pour comprendre les causes des problèmes, alors il devrait être facile de trouver votre propre façon de résoudre ces problèmes.