2 votes

Problème d'utilisation de RSpec pour passer des paramètres à une méthode de modèle simulé dans une action de contrôleur Rails.

J'essaie de simuler la méthode de sauvegarde d'un modèle utilisateur pour qu'elle renvoie false, et de simuler ce que le contrôleur ferait en cas d'échec de la validation.

Mon cahier des charges ressemble à ça :

require 'spec_helper'

describe UsersController do
  describe 'POST create_email_user' do
    it 'responds with errors json if saving the model fails' do
      @params = {
        :last_name => 'jones',
        :email => 'asdfasdfasfd@'
      }
      User.stub(:new_email_user) .with(@params) .and_return(@mock_user)

      @mock_user.stub(:save) .and_return(false)

      post :create_email_user, :user => @params, :format => :json

      response.body.should == @mock_user.errors.as_json
      response.status.should == :unprocessable_entity
    end
  end
end

L'action du contrôleur ressemble à cela :

class UsersController < ApplicationController
  def create_email_user
    @user = User.new_email_user(params[:user])
    if @user.save
      # code left out for demo purposes
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end
end

Lorsque j'exécute cette spécification, j'obtiens l'erreur qui dit essentiellement que l'appel attendu à new_email_user a reçu de mauvais arguments :

  1) UsersController POST create_email_user responds with errors json if saving the model fails
     Failure/Error: post :create_email_user, :user => @params, :format => :json
       <User(id: integer, email: string, encrypted_password: string, reset_password_token: string, reset_password_sent_at: datetime, remember_created_at: datetime, sign_in_count: integer, current_sign_in_at: datetime, last_sign_in_at: datetime, current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime, updated_at: datetime, uid: string, provider: string, first_name: string, last_name: string, registration_id: integer, gender: string, authentication_token: string) (class)> received :new_email_user with unexpected arguments
         expected: ({:last_name=>"jones", :email=>"asdfasdfasfd@"})
              got: (["last_name", "jones"], ["email", "asdfasdfasfd@"])
        Please stub a default value first if message might be received with other args as well. 

Il semble que rails convertisse le has en un tableau de paires clé-valeur, alors que mon code utilise simplement le hash direct dans la configuration.

Comment puis-je simuler cette conversion vers un tableau, ou est-ce que je fais autre chose de mal ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X