【问题标题】:How do I stub out a current user's attributes in a view spec如何在视图规范中存根当前用户的属性
【发布时间】:2012-09-08 09:13:17
【问题描述】:

我有一个视图规范,我正在测试条件输出。如何让规范返回我模拟出来的用户?

查看文件

.content
 - if @current_user.is_welcome == true
  Welcome to the site 

查看规格

before(:each) do 
  @user = mock_model(User)
  @user.stub!(:is_welcome).and_return(true)
  view.stub(:current_user).and_return(@user) 
end

it "show content" do 
  #assign(:current_user, stub_model(User, dismiss_intro: true))
  render
  rendered.should have_content("Welcome to the site")
end

运行规范返回undefined method is_welcome for nil:NilClass

【问题讨论】:

    标签: ruby-on-rails rspec mocking stubbing


    【解决方案1】:

    您已将名为 current_user 的方法存根,而不是实例变量 @current_user

    view.stub(:current_user).and_return(@user)
    

    这意味着,在视图中,您应该使用:

    .content
     - if current_user.is_welcome == true
      Welcome to the site
    

    请注意,它调用方法 current_user 而不是获取 @current_user 实例变量。

    如果需要实例变量,建议创建方法current_user,获取实例变量并返回。

    【讨论】:

    • My ApplicationController 返回实例变量helper_method :current_user,它返回@current_user。我只是不认为我理解存根。
    • 您已经存根了一个方法,但您正试图访问一个变量。变量是nil,因为它还没有被初始化。
    • 你不应该/不能。这就是为什么我说要改变你的看法。
    【解决方案2】:

    我最终这样做了,这让我将 @current_user 变量保留在我的视图中,并使规范通过:

    before :each do
      @user = stub_model(User, is_welcome: true)
      assign(:current_user, @user)
    end
    

    然后为了测试条件,只需在具有不同前块的上下文中运行另一个规范:

    before :each do
      @user = stub_model(User, is_welcome: false)
      assign(:current_user, @user)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2015-11-25
      • 2015-12-26
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多