Как заглушить `current_user` с update_attributes, установленным в false? - PullRequest
5 голосов
/ 10 сентября 2010

Это чисто синтаксический вопрос. Я очень новичок в RSpec.

Я в основном хочу написать что-нибудь в строках этой ошибочной строки:

controller.stub!(:current_user(:update_attributes => false))

Кто-нибудь знает, как правильно написать это?

По умолчанию RSpec выглядит так:

User.stub(:find) { mock_user(:update_attributes => false) }

Ответы [ 4 ]

8 голосов
/ 10 сентября 2010

Это похоже на случай для stub_chain:

controller.stub_chain(:current_user,:update_attributes).and_return(false)

Обратите внимание, что это просто заменит методы в списке в порядке их появления, поэтому дляв вашем контроллере будет иметь значение current_user.update_attributes.Если у вас есть что-то вроде @user.update_attributes, я не думаю, что это сработает.

Подробнее о APIDock

6 голосов
/ 10 сентября 2010

Я просто слепо поиграл с тысячей вариаций и, наконец, понял, что это так:

controller.stub!(:current_user).and_return(@user)
@user.stub!(:update_attributes => false)

А если серьезно, это вообще имеет какой-то смысл?Проходит: D

2 голосов
/ 24 сентября 2014

С RSpec 3.0 и rspec-mocks способ сделать это - использовать allow.

before(:each) do
  @user = mock_model(User)
  allow(controller).to(receive(:current_user).and_return(@user))
  allow(@user).to(receive(:update_attributes).and_return(false))
end
0 голосов
/ 01 марта 2016

Это не относится конкретно к update_attributes, но у меня сработало следующее. Предполагая, что ваш помощник current_user живет в ApplicationController:

user = double(:user)
allow(controller).to(receive(:current_user).and_return(user))
allow(controller.current_user).to receive(:is_admin?).and_return(false)

current_user.is_admin? # => false
...