Je tiens à tester qu'un membre du personnel est associé à une entreprise dans mes tests de contrôleur RSPEC.
J'aimerais retrouver cela dans mon où Comment écrire un test pour cela? p> J'ai ces modèles p> Le test suivant est ma tentative Pour spécifier l'association et il échoue lorsque j'entrerai dans le code de l'association: p> si je saisi le code "Staff.co.Canies" Code actuel_company dans mon contrôleur, je reçois cette erreur Lors de l'exécution de ce test: P> Créer code> Action du contrôleur du personnel:
actuel_company code> est collecté à partir d'une variable de session. p>
def create
@staff = Staff.new(params[:staff])
if @staff.save
@staff.companies << current_company
redirect_to staff_index_path, :notice => "Staff created successfully!"
else
@company = @staff.firm || current_company
flash[:alert] = "Staff failed to create"
render "new"
end
end
4 Réponses :
Vous pouvez le tester avec:
staff.should have(1).company
Si vous êtes dans votre spécification de contrôleur, j'utiliserais Stub_CHAIN CODE>
staff.stub_chain(:company, :<<).once.and_return(true)
Cela ne stipule-t-il pas simplement les "Staff.comPanies" Current_Company '? Si j'utilise ce talon et que je n'inclut pas 'Staff.comCanies << Current_Company' dans ma méthode de création, mon test passera toujours. Je voudrais m'assurer que la ligne 'Staff.comPanies << Current_Company' est dans mon code de création.
la fois. Vérifie pour vous assurer que la chaîne est appelée et soulever une affirmation si non. Donc, tu devrais aller, je pense (sauf si je manque quelque chose ...)
Il ne semble pas se plaindre si je n'ai pas la ligne "Staff.comPanies" Current_Company "dans ma méthode de création.
Je ne comprends toujours pas ce que le personnel code> dans votre test (tests de tous) fait référence à. Voulez-vous dire
@Staff code>? Ou existe-t-il une certaine configuration qui n'a pas été montrée qui définit le personnel code> code>? Ou est-ce que je manque quelque chose d'évident ??
Le personnel de mes tests serait juste une maquette en utilisant 'let (: le personnel) {mock_model (personnel)}'
J'utiliserais une approche différente, car testez que le modèle doit recevoir un certain message couple vos tests trop étroitement à la mise en œuvre. Vous souciez-vous vraiment de savoir si les entreprises reçoivent Vraiment, ce que vous voulez tester, c'est si la société de l'utilisateur est enregistrée lorsqu'elles posteront sur la page. Peu importe comment em> il a été enregistré. Donc, je ferais quelque chose comme ceci: p> Ceci est tester le comportement au lieu de la mise en œuvre. L'avantage est que votre test ne soit pas échouer lorsque quelqu'un change que # <<< / code> ou une autre méthode?
<<< / code> sur l'équivalent
poussez code>. Il présente également l'avantage d'être plus clair sur votre intention et de mieux documenter le code. P> P>
Merci Ian, c'est exactement ce que je cherchais. Cela me donne beaucoup de place pour refroidir mon code aussi.
Très bonne réponse. Juste au cas où vous vous demandez où le nil. <<< / code> est venu de: dans RSPEC,
Staff.should_receive (: Sociétés) CODE> signifie "STATEURS) .and_return (nil) `
Le problème avec le code est qu'une fois que vous talez une méthode - il n'existe plus sur le modèle plus.
Vous avez mis sur pied la méthode "Sociétés" (lorsque vous définissez l'attente sur elle) et , n'appelle plus la réelle association de sociétés du modèle, mais le talon que vous avez créé ... qui retourne nil (parce que vous n'avez pas défini de valeur de retour dessus). P>
Alors, Lorsque vous essayez de mettre une entreprise dans cette nouvelle méthode NULL, il est indiqué que cela ne peut pas faire cela. P>
Pour vous déplacer, vous pouvez faire ce que vous avez fait pour définir une valeur de retour: p> qui s'assurera alors: p> ne manquera pas avec l'horrible erreur NIL (car il y a et réel , réel tableau pour la société à entrer). P> Mais vraiment la meilleure chose à faire est que les personnes précédentes ont suggéré et testent ce que vous avez vraiment besoin de tester - ce que vous avez vraiment besoin de tester un personnel avec des entreprises provoquera une nouvelle entreprise à être sauvée à la DB. P> p>
Je suppose que l'erreur (l'objet nil) est dans votre action. Pouvez-vous ajouter votre code d'action Créer de votre contrôleur - celui qui appelle ce test?
Pour dépasser le problème de l'objet Nil et continuer avec TDD, j'utilise les éléments suivants: Staff.Should_receive (: Sociétés) .and_RETURN ([])