これは純粋な構文の問題です。私はRSpecに非常に慣れていません。
私は基本的に、このエラー行の行に何かを書きたいと思っています:
controller.stub!(:current_user(:update_attributes => false))
それを正しく書く方法を知っている人はいますか?
RSpec のデフォルトは次のようになります。
User.stub(:find) { mock_user(:update_attributes => false) }
これは純粋な構文の問題です。私はRSpecに非常に慣れていません。
私は基本的に、このエラー行の行に何かを書きたいと思っています:
controller.stub!(:current_user(:update_attributes => false))
それを正しく書く方法を知っている人はいますか?
RSpec のデフォルトは次のようになります。
User.stub(:find) { mock_user(:update_attributes => false) }
これは次の場合のように見えますstub_chain
:
controller.stub_chain(:current_user,:update_attributes).and_return(false)
これは、リスト内のメソッドを発生順に置き換えるだけであることに注意してください。そのため、これを理解するにはcurrent_user.update_attributes
、コントローラーに a を含める必要があります。のようなものがある場合@user.update_attributes
、うまくいかないと思います。
APIDockの詳細
私は盲目的に千のバリエーションで遊んで、最終的にこれで合格しました:
controller.stub!(:current_user).and_return(@user)
@user.stub!(:update_attributes => false)
しかし、真剣に、それは意味がありますか?通り過ぎます:D
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
これは特に 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