Comment passer une variable d'instance pour une RSpec partagée exemple
Je suis en utilisant RSpec (2.10.1) pour tester des validations sur un modèle et en avons extrait un peu de code pour partager avec d'autres modèle de validation. Les validations ont d'abord été écrit sur la table Sociétés, de sorte que le code ressemble à ceci:
# support/shared_examples.rb
shared_examples "a text field" do |field, fill, length|
it "it should be long enough" do
@company.send("#{field}=", fill * length)
@company.should be_valid
end
etc...
end
et l'usage est:
# company_spec.rb
describe Company do
before { @company = Company.new( init stuff here ) }
describe "when address2" do
it_behaves_like "a text field", "address2", "a", Company.address2.limit
end
etc...
end
Je voudrais passer le @company
en tant que paramètre de l'exemple afin que je puisse réutiliser le code pour les différents modèles, quelque chose comme ceci:
# support/shared_examples.rb
shared_examples "a text field" do |model, field, fill, length|
it "it should be long enough" do
model.send("#{field}=", fill * length)
model.should be_valid
end
etc...
end
et l'usage est:
# company_spec.rb
describe Company do
before { @company = Company.new( init stuff here ) }
describe "when address2" do
it_behaves_like "a text field", @company, "address2", "a", Company.address2.limit
end
etc...
end
Cependant, quand je fais cela je reçois undefined method 'address2' for nil:NilClass
. Il semble @company
n'est pas passé (pas dans le champ d'application?) Comment puis-je obtenir quelque chose comme cela fonctionne?
Vous devez vous connecter pour publier un commentaire.
Le problème est que
self
dans l'exemple de groupe est différente deself
dans unbefore
crochet, donc ce n'est pas la même variable d'instance, même si elle a le même nom.Je vous recommande d'utiliser
let
pour les cas comme ceux-ci:self
est différent, où est-il différent? Pourquoi ne@company.send()
et@company.should
travail dansshared_examples
? Dans votre suggestion, je peux les remplacerCompany.new()
avec@company
(en gardant lesbefore
bloc) et qui fonctionne. Ma compréhension est manquant quelque chose à propos de ce qui se passe exactement ici. Il semble queself
est seulement différente, dans un lieu particulier (la ligneit_behaves_like
jusqu'àdo
).self
prend en RSpec, et c'est analogue pour les deux valeurs de soi dans un ruby définition de la classe. Entre undescribe
/context
/shared_examples_for
et de ses correspondantsend
(mais pas dans leit
blocs),self
est l'exemple du groupe, tout commeself
dans un corps de classe (mais pas dans une définition de la méthode) est la classe elle-même.self
dans unit
/let
bloc ou unbefore
/after
/around
crochet ou en est l'exemple, tout commeself
dans une classe de l'instance de définition de la méthode est l'instance de la classe.describe
/context
/shared_examples_for
des blocs afin de définir tous les exemples; à ce stade,self
dans ces contextes, c'est l'exemple correspondant de groupe. Deuxièmement, RSpec fonctionne tout le défini exemples (lait
blocs). Chaque définie exemple est évalué dans une instance de l'exemple correspondant de groupe, etself
est l'exemple.it-self
alors il devrait se regarder dans le champ d'application dedescribe-self
. Ou, il devrait y avoir quelque chose pour obtenir des variables à partir de l'autre soi-même (c'est à direotherself.company
). Mon code utilisesubject(@company)
, et depuis, j'ai constaté que je peux utilisersubject
pour remplacermodel
, mais qui a un code de l'odeur de son propre.Company
de code de configuration à travers de multiplesit_behaves_like
invocations. AIUI c'est le point de l'ensemble de la question; l'original de l'affiche veut être en mesure de le mettre dans unbefore
bloc pour les réutiliser (et moi aussi :-/)before
bloc ou dans unlet
dans leCompany
groupe exemple: gist.github.com/myronmarston/4986865 . J'ai toujours tendance à privilégier unlet
méthode par rapport à des variables d'instance pour ces cas, parce que les variables d'instance de printemps à l'existence au moment de référence, qui est ce qui a causé l'affiche originale du problème: les deux@company
variables dans les exemples sont séparés (dont l'un est nul), mais ce n'est pas évident.let
pour cela.