RSpec обращается к методам application_controller, таким как 'current_user' - PullRequest
6 голосов
/ 15 сентября 2010

Я пытаюсь удалить метод для моего current_user (используя модифицированное решение для аутентификации restful_authentication) с помощью rspec. Я совершенно не уверен, как я могу получить доступ к этому методу в моих спецификациях контроллера. Сам по себе current_user не работает. Нужно ли сначала получить сам контроллер? Как мне это сделать?

Использование rails 2.3.5, rspec 1.3.0 и rspec-rails 1.3.2

# my_controller_spec.rb
require 'spec_helper'

describe MyController do

  let(:foos){ # some array of foos }

  it "fetches foos of current user" do
    current_user.should_receive(:foos).and_return(foos)
    get :show
  end
end

Производит

NoMethodError in 'ChallengesController fetches foos of current user'
undefined method `current_user' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1::Subclass_1::Subclass_2::Subclass_2:0x7194b2f4>

Ответы [ 4 ]

2 голосов
/ 16 сентября 2010

rspec-rails дает вам метод controller для использования в примерах контроллеров.Итак:

controller.stub!(:current_user).with(:foos).and_return(foos)

должно работать.

1 голос
/ 04 марта 2011

как узнать где найти current_user?это должно решить это:

subject.current_user.should_receive(:foos).and_return(foos)
0 голосов
/ 01 января 2013

Я прочитал это и немного подправил. Если вы просто хотите передать пользовательский объект в тест Rspec, вы можете использовать это:

  1. Сначала создайте пользовательский объект в тесте rspec. Например: (используйте любые атрибуты, которые вам нужны или необходимы для создания объекта пользователя.)

    user = User.create (name: "ted")

    (Примечание: вы также можете использовать фабрику из FactoryGirl.)

  2. Теперь, с тем пользовательским объектом, который сохранен в переменной «пользователь», сделайте это в том же тесте Rspec:

    controller.stub! (: Current_user) .and_return (пользователь)

это должно сработать ...

0 голосов
/ 16 сентября 2010

Я не совсем знаком с restful_authentication, просто Authlogic и Devise, но он, вероятно, похож в том, что current_user - это метод контроллера, а не объект, поэтому вызов should_receive для него не работает должным образом (вы устанавливаете ожидание для объекта, который current_user возвращает , но метод не доступен в рамках вашего ожидания).

Попробуйте это:

stub!(:current_user).and_return(foos)

...