如何在update_attributes设置为false的情况下存根“current_user”?

时间:2010-09-09 23:31:32

标签: ruby-on-rails ruby-on-rails-3 rspec rspec2

这是一个纯粹的句法问题。我对RSpec很新。

我基本上想在这条错误行的行上写一些东西:

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

任何人都知道如何正确地写这个?

RSpec的默认设置如下:

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

4 个答案:

答案 0 :(得分:8)

这看起来像stub_chain

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

请注意,这只是按照它们发生的顺序替换列表中的方法,因此为了理解这一点,您的控制器中将有current_user.update_attributes。如果您有类似@user.update_attributes的内容,我认为它不起作用。

有关APIDock

的更多信息

答案 1 :(得分:6)

我只是盲目地玩了一千种变化,最后还是通过了这个:

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

但严重的是,这甚至没有任何意义吗?它正在传递:D

答案 2 :(得分:2)

使用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

答案 3 :(得分:0)

这不具体针对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