2017-10-10 9 views
1

Je suis nouveau à Rspec et j'essaie de tester mes méthodes de contrôleur pour les fonctionnalités de base. Je sais que je ne suis pas censé tester les fonctionnalités de base, mais je le fais plus à des fins d'apprentissage que pour construire quelque chose.Rspec post: créer 'mot-clé inconnu:'

J'ai un contrôleur appelé ProtocolsController. Le contrôleur est utilisé pour la fonctionnalité CRUD de base. J'essaie de tester la méthode #create des contrôleurs. Ci-dessous mon contrôleur #create:

def create 
    @protocol = Protocol.new(protocol_params) 

    if @protocol.save 
     flash[:notice] = 'New protocol added' 
     redirect_back(fallback_location: 'test_results#index') 
    else 
     flash[:notice] = @protocol.errors[:name] 
     render 'new' 
    end 
    end 

Pour tester le chemin triste, je veux passer au contrôleur un objet simulé qui contient les paramètres nécessaires à la création d'une instance de la classe Protocole. Pour ce faire, j'ai le code suivant:

describe '#create' do 
    it 'fails to save because the name already exists' do 
     params = FactoryGirl.attributes_for(:protocol) 
     post :create, :protocol => params 
    end 
    end 

Maintenant, je sais que le test est incomplet, mais je teste une ligne à la fois et quand je lance Rspec je reçois l'erreur suivante:

Failure/Error: post :create, :protocol => params 

    ArgumentError: 
     unknown keyword: protocol 

Mais quand je change de poste à: expect { post :create, :protocol => params }

Cela fonctionne. Ce qui m'amène à mes questions:

  • Pourquoi le premier message (post :create, :protocol => params) échoue?
  • Comment procéder pour envoyer un objet simulé au contrôleur?
  • Pourquoi la version attendue fonctionne-t-elle?

Tout aperçu des questions sera grandement apprécié. Je me gratte la tête en essayant de comprendre cela et je suppose que c'est une réponse évidente.

+0

Quelle version de RSpec utilisez-vous? –

+1

la dernière version -> 3.6 – Darkisa

Répondre

4

La façon dont vous vous appelez post ne fonctionne plus dans Rails 5.

Ceci est l'avertissement de dévalorisation de la version précédente:

ActionController::TestCase HTTP request methods will accept only keyword arguments in future Rails versions.

Maintenant, vous devez ajouter la clé params, comme ceci:

post :create, params: { protocol: params }

Notez que post :create, :params => { :protocol => params } signifie la même chose, il est juste une syntaxe différente.

+0

Vous êtes génial! Merci pour ça. Fonctionne comme un charme. Je me demandais ce que je faisais de mal. Merci encore. – Darkisa