Тестирование с помощью Rspec, NiftyAuthentication - PullRequest
2 голосов
/ 11 августа 2011

Я использую nifty:authentication Райана Бейтса и начинаю тестирование с Rspec.Бороться с этим неделями, и до сих пор не понимаю, что происходит.

Мой контроллер просто вызывает

before_filter :login_required, :except => [:login]

Что определено в lib / controller_authentication

def self.included(controller)
    controller.send :helper_method, :current_account, :logged_in?, :redirect_to_target_or_default
  end

  def current_account
    @current_account ||= Account.find(session[:account_id]) if session[:account_id]
  end

  def logged_in?
    current_account
  end

  def login_required
    unless logged_in?
      store_target_location
      redirect_to login_url, :alert => "You must first answer me these riddles three log in or sign up before accessing this page."
    end
  end

  def redirect_to_target_or_default(default, *args)
    redirect_to(session[:return_to] || default, *args)
    session[:return_to] = nil
  end

  private

  def store_target_location
    session[:return_to] = request.url
  end
end

Приложение работает так, как задумано, но каждый раз тестирование не выполняется.Независимо от того, что я пытаюсь, я получаю redirect_to login_url, :alert => "You must first ...log in" страницу.

Вещи, которые я пробовал:

controller.stub!( :login_required )
ControllerAuthentication.stub!(:current_account).and_return(Account.where(:username => 'ej0c').first)
#ControllerAuthentication.stub!(:logged_in?).and_return(Account.where(:username => 'ej0c').first)
ControllerAuthentication.stub!(:login_required).and_return(true)
MyDigisController.stub!( :login_required ).and_return(true)

Что, я думаю, означает, что я упускаю всю теорию вещей.Как мне сделать так, чтобы мой логин работал?


Я пытался, как рекомендует Punit ниже: [pre]

require 'spec_helper'

describe "View event details" do

  it "Should show a table of events" do
     @account = Account.where(:username => 'ej0c').first
     puts @account.inspect
     controller.stub!(:current_account).and_return(@account)
     controller.stub!(:logged_in?).and_return(true)
     session[:account_id] = @account.id
      visit '/my_digis/66/custom_events'
      page.should have_content('Events')

  end
end

@account.inspect отображался хорошо, но я также получил

An expectation of :current_account was set on nil. Called from C:/Users/Ed/webapps/whendidji3/spec/con
.rb:8:in `block (2 levels) in <top (required)>'. Use allow_message_expectations_on_nil to disable warn
An expectation of :logged_in? was set on nil. Called from C:/Users/Ed/webapps/whendidji3/spec/controll
:in `block (2 levels) in <top (required)>'. Use allow_message_expectations_on_nil to disable warnings.

Спасибо за любые подробные объяснения, так как я искал хай-лоу, чтобы понять, что происходит.

Ответы [ 3 ]

3 голосов
/ 14 августа 2011

Вы используете спецификацию vanilla, а не спецификацию контроллера, что означает, что переменная 'controller' не устанавливается.

Чтобы использовать спецификацию контроллера, вам нужно передать имя класса контроллера в ваш блок описания, а не в строку.

describe MyController do

см. http://rspec.info/rails/writing/controllers.html

Как только вы это сделаете, вы сможете использовать свою первоначальную мысль о заглушке login_required

0 голосов
/ 17 августа 2011

ОК, ответ был таков: мне нужна была спецификация запроса.

Я начал со спецификации запроса, но ее не было в папке requests, и вопросы, которые я задавал, изменились.в спецификацию половинного запроса / половинного контроллера, ни один из которых не работает.

Странная вещь в rspec - то, что он будет жаловаться, если метод капибары плохо сформирован, ... но не будет упоминатьэта вещь просто не работает там, где вы ее положили!

Моя рабочая спецификация, расположенная в specs/requests/my_digis_spec.rb, равна

require 'spec_helper'

describe "MyDigis" do

   before :each do
@account = Account.where(:username => 'me').first
visit login_path
    fill_in 'Username or Email Address', :with => @account.email
    fill_in 'Password', :with => 'password'
  click_button('Log in')

end

it "Shows list of digis" do
  visit my_digis_path
  page.should have_content('Your Custom Event groups')
end

it "Lets you modify didji list" do
  visit my_digis_path
  click_button('Modify events')
  page.should have_content('Events for my_digi')
end

end

Так же просто, как рекламировалось, мне потребовалось 5 недель, чтобы получить регистрационную часть.Спасибо.

0 голосов
/ 11 августа 2011

Вам нужно заглушить метод current_account.Вы можете сделать это следующим образом -

@account = create_account #function to create an account for your specs
controller.stub!(:current_account).and_return(@account)
controller.stub!(:logged_in?).and_return(true)

Возможно, вам следует создать метод из вышеприведенных строк, чтобы заглушки аутентификации, где это необходимо.

...