FactoryGirl, Rspec, laissez, et avant les problèmes
Je suis à l'aide de certains de ces outils pour la première fois. J'ai lu à travers les docs mais je voulais demander ici exactement ce que je suis en train de réaliser.
J'ai un ensemble d'utilisateurs que je veux tester certaines actions que je peux faire dans un contrôleur de spec. Lors de chaque utilisateur est créé, il y a un ensemble de rappels qui ont lieu pour créer des objets associés.
J'aimerais avoir accès à ces instances d'utilisateur et les objets associés de ActiveRecord classe. Ainsi, par exemple, un utilisateur disposera d'un ensemble de listes donc je voudrais être en mesure d'appeler user1.les listes par exemple.
Aussi, j'aimerais isoler cette configuration en haut et à l'utilisation soit de laisser ou d'un avant noir. Il semble que tout le qualifiant de laisser comme ceci:
# will test that get_count_for_list will return 5
describe ApiController do
# why same name - seems really confusing!
let(:user) { FactoryGirl.create(:user) }
let(:user2) { FactoryGirl.create(:user2) }
ne pas appeler l'associé rappels. Est-ce correct? Ou est-il peut-être un problème de synchronisation?
J'aime la syntaxe d'utilisation de let et de pouvoir accéder à ces objets dans mon ExampleGroups de l'utilisateur.id, mais ne peut pas l'accès de l'utilisateur.les listes. Actuellement, je suis en train de faire quelque chose comme:
# will test that get_count_for_list will return 5
describe ApiController do
# why same name - seems really confusing!
let(:user) { FactoryGirl.create(:user) }
let(:user2) { FactoryGirl.create(:user2) }
let(:user3) { FactoryGirl.create(:user3) }
before do
FactoryGirl.create(:user2)
FactoryGirl.create(:user3)
end
mais l'impression qu'il y a à être une meilleure façon. Je suis la création de ces de l'utilisateur deux fois?
thx
edit 1
J'ai isolé le code en question ici. Le global_id la valeur est créée par l'intermédiaire d'un rappel. Il existe correctement dans la base de données et peut être consulté via le correspondant find_by_email mais à l'aide de l'utilisateur2 var ne donnent pas accès.
require 'spec_helper'
# will test that get_count_for_list will return 5
describe ApiController do
# why same name - seems really confusing!
let!(:user) { FactoryGirl.create(:user) }
let!(:user2) { FactoryGirl.create(:user2) }
let!(:user3) { FactoryGirl.create(:user3) }
before do
session[:user_id]=user.id # works
end
describe 'FOLLOW /UNFOLLOW options' do
it 'shall test the ability to follow another user' do
puts "user1: " + user.global_id.to_s # doesn't output anything
u2=User.find_by_email('[email protected]') # corresponds to user2
post :follow, :global_id => user2.global_id # doesn't work
#post :follow, :global_id => u2.global_id #works
u3=User.find_by_email('[email protected]')
puts "user_3" + u3.global_id.to_s # outputs correct value
post :follow, :global_id => user3.global_id #doesn't work
#post :follow, :global_id => u3.global_id # works
post :unfollow, :global_id => user.following.sample(1)
response.code.should eq('200')
end
end
end
source d'informationauteur timpone
Vous devez vous connecter pour publier un commentaire.
Vérifier la rspec doc: https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/helper-methods/let-and-let
Noter que laissez est paresseux-évalué: il n'est pas évaluée jusqu'à ce que la première fois, la méthode qu'il définit est invoquée. Vous pouvez utiliser le laisser! à force de la méthode d'invocation avant chaque exemple.
En d'autres termes, si vous utilisez
let
avecfactory_girl
un record ne sera pas créé avant de laisser-variable invocation.Le code correct est:
Je viens de résoudre un même consonance problème. Mon authentification de l'utilisateur spec a pas de passage à l'aide de 'laisser'.
my broken spec:
Ce n'était pas de travail. Le journal d'authentification n'était pas comme si l'utilisateur l'enregistrement n'a pas fait dans la base de données lors de mes séances de contrôleur tente de s'authentifier. J'ai essayé de remplacer le laisser à laisser! mais cela n'a pas de résoudre quoi que ce soit. La lecture de ce post, et le lien ci-dessus expliquant let et let! J'ai réalisé que je ne devrais pas être à l'aide de laisser pour cette spécification. Maintenant, j'ai un passage spec: