2016-12-08 3 views
0

Je ne suis pas nouveau sur Rails TDD mais j'aimerais profiter de cette opportunité pour apprendre. Cependant, j'ai une application MVC qui reçoit les commentaires des clients. Ce que j'ai fait a été d'abord développé la fonction et commencé TDD plus tard (ce que je sais que ce devrait être l'inverse: P. Mais parce que je suis nouveau à TDD, je pensais que je les mettrais une fois mes fonctionnalités terminées (route, contrôleur, validation du modèle)Rails TDD avec RSpec & Capybara échouent

Cependant, je ne pouvais pas passer mon test, puis-je savoir quel est le problème avec le code de test? Et comment devrais-je créer une SAMPLE data ONCE et l'utiliser pour tester pour tout le contexte dans 1 contrôleur Comment est-ce que je devrais organiser mon test Tout conseils ce qui peut être fait pour améliorer pour un débutant dans TDD? J'ai lu quelques blogs & articles par lesquels nous pouvons employer factorygirl? données "et ai-je besoin de fichier supplémentaire pour stocker les valeurs ou quelque chose?

Corrigez-moi aussi si je me trompe. Capybara est-il utilisé pour le test de l'interface utilisateur? Comme il est utilisé plus sur le test de l'interface utilisateur. D'autres outils comme le sélénium peuvent être utilisés pour remplacer Capybara non?

feedback.rb

class Feedback < ActiveRecord::Base 
    validates_presence_of :name, :message => "Name is required before giving a feedback." 
    validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, :message => "Invalid email address !", :allow_blank => true 
    validates :telephone_no, :numericality => {:allow_blank => true} 
end 

feedbacks_controller.rb

class FeedbacksController < ApplicationController 

    def create 
    @feedback = Feedback.create(feedback_params) 

    if @feedback.errors.any? 
     flash[:error] = @feedback.errors 
     render 'new' 
    else 
     redirect_to :back 
    end 

    end 

    def new 
    @feedback = Feedback.new 
    end 

    private 
    def feedback_params 
     params.require(:feedback).permit(:name, :email, :telephone_no, :comment, 
        :approved) 
    end 

end 

feedback_controller_spec.rb exigent "rails_helper"

describe 'Feedback#Create' do 

    context 'when param[:name] is not present' do 
    @feedback = Feedback.create 
    it 'should flash error' do 
     expect(flash[:error]).to match(/Name is required before giving a feedback .*/) 
    end 
    it 'should render back to new' do 
     is_expected.to render_template new_path 
    end 
    end 


    context 'when param[:name] is present' do 
    @feedback = Feedback.create(:name => "Hah") 
    @feedback.save 
    it 'should redirect to homepage' do 
     is_expected.to redirect_to new_feedback_path 
    end 
    end 


    context 'when param[:name] is present but with invalid param[:email]' do 
    it 'should flash error' do 
    end 
    end 

end 

Répondre

0

Thats beaucoup de questions dans une question, et sera probablement battant pavillon d'être trop large - mais voici une vue d'ensemble

Capybara: une bibliothèque pour le contrôle des navigateurs et des assertions basées sur le contenu des pages dans les navigateurs. Si vous utilisez le pilote sélénium alors Capybara utiliserait seleniun, donc oui vous pouvez échanger Selenium pour Capybara et écrire un tas de code - Capybara rend le tout plus facile. Capybara est utilisé pour les spécifications des fonctionnalités (tests de bout en bout pilotés via l'interface utilisateur) - et non pas les spécifications du contrôleur, et aucun de vos tests présentés n'utilise actuellement Capybara. Ses matchers peuvent également être utilisés dans les spécifications de vue.

Données pour les tests: Des données doivent être créées pour chaque test afin que chaque test soit indépendant de tous les autres tests. RSpec, par défaut, exécute les tests dans un ordre aléatoire afin de l'appliquer. Il y a deux manières principales de créer les données pour les essais dans les rails, les appareils et les usines. FactoryGirl est une implémentation d'usines et vous permet de définir les valeurs par défaut pour les attributs dans un modèle, puis de remplacer ces valeurs uniquement par les valeurs d'attribut spécifiquement requises pour le test (en utilisant les autres valeurs par défaut pour conserver les objets). Le Getting Started Guide donne beaucoup d'exemples sur son utilisation.