8
votes

Association de test RSPEC

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 Créer code> Action du contrôleur du personnel: xxx pré>

actuel_company code> est collecté à partir d'une variable de session. p>

Comment écrire un test pour cela? p>

J'ai ces modèles p> xxx pré>

Le test suivant est ma tentative Pour spécifier l'association et il échoue lorsque j'entrerai dans le code de l'association: p> xxx pré>

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>

  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


2 commentaires

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 ([])


4 Réponses :


1
votes

Vous pouvez le tester avec:

staff.should have(1).company


0 commentaires

2
votes

Si vous êtes dans votre spécification de contrôleur, j'utiliserais Stub_CHAIN ​​ CODE>

staff.stub_chain(:company, :<<).once.and_return(true)


5 commentaires

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 dans votre test (tests de tous) fait référence à. Voulez-vous dire @Staff ? Ou existe-t-il une certaine configuration qui n'a pas été montrée qui définit le personnel ? 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)}'



14
votes

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 # <<< / code> ou une autre méthode?

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 il a été enregistré. Donc, je ferais quelque chose comme ceci: xxx

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> sur l'équivalent poussez . Il présente également l'avantage d'être plus clair sur votre intention et de mieux documenter le code.


2 commentaires

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) signifie "STATEURS) .and_return (nil) `



1
votes

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).

Alors, Lorsque vous essayez de mettre une entreprise dans cette nouvelle méthode NULL, il est indiqué que cela ne peut pas faire cela.

Pour vous déplacer, vous pouvez faire ce que vous avez fait pour définir une valeur de retour: xxx

qui s'assurera alors: xxx

ne manquera pas avec l'horrible erreur NIL (car il y a et réel , réel tableau pour la société à entrer).

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.


0 commentaires