2016-12-08 2 views
0

J'ai deux classes de modèle dans une relation "parent-chid", ou une association.Test du modèle enfant avec RSPEC et obtention de l'ID de la méthode d'erreur non définie

organizations est la table parent/le modèle ayant les attributs: id, organization_name, created_at and updated_at.

events est la table/modèle enfant ayant les attributs: id, event_description, host_name, created_at, updated_at and organization_id.

L'association entre les organisations et les dossiers d'événements est events.organization_id = organizations.id, ou est spécifié dans les classes de modèle:

class Event < ApplicationRecord 
... 
    belongs_to :organization 
... 
end 

class Organization < ApplicationRecord 
... 
    has_many :events, :dependent => :destroy 
... 
end 

Les tests pour le modèle organizations et organizations contrôleur fonctionne sans erreur. Le test pour le contrôleur events n'est pas encore construit. L'application entièrement fonctionnelle et fonctionne sans aucune erreur.

Le problème que j'ai est que je ne peux pas faire passer le test du modèle d'événements.

Voici mon code.

factories/organizations

FactoryGirl.define do 
    factory :organization do 
    organization_name { Faker::Company.name } 
    end 
    factory :invalid_organization, class: Organization do 
    organization_name '' 
    end 
end 

factories/events

FactoryGirl.define do 
    factory :event do 
    event_description { Faker::Lorem.sentence(3) } 
    host_name { Faker::Internet.domain_name } 
    organization = build(:organization) 
    organization_id = organization.id 
    end 
end 

Je suis en train de créer une organisation d'abord et utiliser le id pour l'attribut organization_id du nouveau event à créer.

Ce fichier est le event_spec.rb

require 'rails_helper' 

RSpec.describe Event, type: :model do 
    it "has a valid factory" do 
    event = build(:event) 
    expect(event).to be_valid 
    end 
    it { is_expected.to validate_presence_of(:event_description) } 
    it { is_expected.to validate_presence_of(:host_name) } 
    it { is_expected.to validate_presence_of(:organization_id) } 
    it { is_expected.to belong_to(:organization) } 
end 

Fondamentalement, je veux d'abord créer une organization et utiliser ce id à attribuer à organization_id quand je suis en train de créer et event.

Lors du test rspec spec/models/event_spec.rb Je reçois cette erreur:

/Users/levi/ror/events-handler/spec/factories/events.rb:6:in `block (2 levels) in <top (required)>': undefined method `id' for #<FactoryGirl::Declaration::Static:0x007febc03db798> (NoMethodError) 

Je ne sais pas comment le résoudre ou comment écrire un meilleur test?

Répondre

0

Je pense que votre usine event devrait ressembler un peu différent:

FactoryGirl.define do 
    factory :event do 
    event_description { Faker::Lorem.sentence(3) } 
    host_name { Faker::Internet.domain_name } 
    organization { build(:organization) } 
    end 
end 
+0

Dans un premier temps j'ai eu cette erreur: organization_id: néant> pour être valide, mais des erreurs a obtenu: Organisation ne peut être vide. Afin d'éliminer cette erreur j'ai ajouté cette ligne dans la fabrique d'organisation: id {Faker :: Number.number (5)} et après que le test passé avec succès. Merci beaucoup! –

+0

vous ne devez pas définir un ID aléatoire pour 'organisation'. Meilleure option serait de réellement 'create' organisation (au lieu de' build') – faron

+0

Lors de la suppression de la génération d'ID de l'usine d'organisation et en remplaçant dans votre solution l'organisation en ligne {build (: organisation)} avec l'organisation en ligne = FactoryGirl.create (: organisation), j'obtiens l'erreur: /Users/levi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/factory_girl-4.7.0/lib/factory_girl/registry.rb: 24: dans 'trouver ': Usine non enregistrée: organisation (ArgumentError) –