29 votes

RSpec donne une erreur 'trait non enregistré : nom'

J'ai essayé de tester mon application Rails 3 sur Windows avec RSpec. J'ai écrit des tests et des factories, mais je n'arrive pas à résoudre les problèmes qui surviennent lorsque je lance RSpec en ligne de commande.

Voici l'un des fichiers de test : require 'spec_helper'

décrire "SignIns" do
  it "peut se connecter" do
    user = FactoryGirl.create(:user)
    visit new_user_session_path
    fill_in "login", with: user.username
    fill_in "password", with: user.password
    click_on "sign in"
    current_user.username.should == user.username
  end
end

Et voici le factories.rb :

factory :layout do
  name "layout1"
end

factory :club do
  sequence(:name) { |i| "Club #{i}" }
  contact_name "John Doe"
  phone "+358401231234"
  email "#{name}@example.com"
  association :layout
end

factory :user do
  sequence(:username) { |i| "user#{i}" }
  password 'password'
  email "test@example.com"
  club

Lorsque j'essaie de lancer RSpec, cela me donne l'erreur suivante :

très non enregistré : name
  #C: in 'objet'
  #.spec/features/sign_in_spec.rb:11:dans 'bloc (2 niveaux) dans (supérieur (requis))

Qu'est-ce que je fais de mal ?

67voto

user736932 Points 128

Je sais que c'est une vieille question, mais au cas où quelqu'un d'autre se retrouverait ici en cherchant "Trait not registered":

Lorsque vous utilisez un attribut dépendant comme le email dépend du name dans l'usine :club de la question, vous devez envelopper l'attribut entre des accolades pour qu'il soit évalué de manière paresseuse:

email {"#{name}@example.com"}

7voto

pjam Points 3680

C'est une erreur de FactoryGirl, et il semble que vous utilisez (à spec/features/sign_in_spec.rb:11) quelque chose comme :

FactoryGirl.create :user, :name

Ceci ne fonctionnera que si vous avez enregistré un trait appelé name pour l'usine user, plus d'informations sur les traits ici

Notez que si vous voulez simplement remplacer le nom de l'utilisateur créé, la syntaxe est

FactoryGirl.create :user, name: 'LE NOM'

4voto

LE-HU Points 332

Pour la référence des lecteurs futurs :

Ce qui n'a pas fonctionné - ArgumentError: Trait non enregistré : user_id

    FactoryBot.define do
      factory :startup do
        user_id
        name { FFaker::Lorem.word }
        website { FFaker::Internet.uri(host: 'example.com') }
        founded_at { "01.01.2000" }
      end

Comment j'ai résolu ce problème en utilisant l'une de ces méthodes, quand tout semblait correct :

  1. mettez des accolades vides après user_id

    FactoryBot.define do
      factory :startup do
        user_id {}
        name { FFaker::Lorem.word }
        website { FFaker::Internet.uri(host: 'example.com') }
        founded_at { "01.01.2000" }
      end
  2. Déplacez user_id en dessous des autres blocs d'aide utilisant des blocs :

    FactoryBot.define do
      factory :startup do
        name { FFaker::Lorem.word }
        website { FFaker::Internet.uri(host: 'example.com') }
        founded_at { "01.01.2000" }
    
        user_id
      end

1voto

akostadinov Points 3272

Une autre réponse tardive. Je me suis cogné la tête pendant un moment parce que j'ai oublié que mon modèle est tout neuf et je n'ai pas migré la base de données test. Donc l'attribut n'existait en fait pas.

c'est-à-dire il fallait exécuter au préalable

rails db:migrate RAILS_ENV=test

0voto

Nikita Fedyashev Points 4160

Dans mon cas, aucune des réponses ci-dessus n'a aidé à résoudre l'erreur trait not registered.

Cette fois-ci, cela était causé par un ordre de chargement incorrect des factories. J'ai déplacé un fichier avec des traits globaux déclarés et FactoryBot a commencé à le charger dans un ordre incorrect.

Comment ai-je résolu le problème? Je l'ai renommé en "spec/factories/01_factory_traits" et le problème est résolu.

Il y a peut-être une meilleure façon de le faire mais cela fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X