4 votes

RSpec : Comment faire un stub pour un appel de méthode Sorcery dans un contrôleur ?

Contrôleur :

class SessionsController < ApplicationController
  layout 'login'

  def create
    user = login(params[:username], params[:password])
    if user
      redirect_back_or_to root_url
    else
      flash.now.alert = "Username or password was invalid"
      render :new
    end
  end
end

Test :

require 'spec_helper'

describe SessionsController do

  describe "POST create" do

    before(:each) { Fabricate(:school) }

    it "Should log me in" do      
      post(:create, {'password' => 'Secret', 'username' => 'director'})
      response.should redirect_to('/')
    end
  end

end

Fabricate(:school) a un callback qui génère le premier utilisateur. Je veux refactoriser ce code pour qu'il n'utilise aucun appel à la base de données. Je veux bloquer l'appel de connexion pour qu'il renvoie true.

Comment pourrais-je bloquer le login méthode ? Elle vient de la sorcellerie.

https://github.com/NoamB/sorcery/blob/master/lib/sorcery/controller.rb#L31

3voto

DangerDave Points 171

Comme la méthode de connexion Sorcery est ajoutée en tant que méthode d'instance au contrôleur, vous devez simuler la méthode sur l'instance actuelle du contrôleur, c'est-à-dire '@controller'. Voir http://api.rubyonrails.org/classes/ActionController/TestCase.html .

Avec Flexmock :

flexmock(@controller).should_receive(:login).and_return(flexmock('user')).once

Ou les mocks RSpec :

@controller.stub(:login) { double "user" }

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