RSpec: Как заглушить вызов метода Sorcery в контроллере? - PullRequest
4 голосов
/ 11 ноября 2011

Контроллер:

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

Тест:

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) имеет обратный вызов, который генерирует первого пользователя. Я хочу реорганизовать этот код, чтобы он вообще не использовал вызовы базы данных. Я хочу заблокировать входящий вызов, чтобы он вернул истину.

Как я мог заглушить метод login? Это происходит от Волшебства.

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

1 Ответ

3 голосов
/ 15 ноября 2011

Поскольку метод входа в систему Sorcery добавлен в качестве метода экземпляра в контроллер, вам необходимо смоделировать метод на текущем экземпляре контроллера, то есть '@controller'. Смотри http://api.rubyonrails.org/classes/ActionController/TestCase.html.

С Flexmock:

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

Или RSpec макеты:

@controller.stub(:login) { double "user" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...