编辑:遵循建议。参见问题末尾。

我有一个具有两个功能的控制器:

 def new
     if login_required
            @discussion = Discussion.new
            respond_to do |format|
                  format.html # new.html.erb
                  format.xml  { render :xml => @discussion }
            end
      end
 end


 def create
     if login_required
         @discussion = Discussion.new(params[:discussion])
         @discussion.update_attribute("user_id",session[:userid])
         respond_to do |format|
         if @discussion.save
            flash[:notice] = 'Discussion was successfully created.'
            format.html { redirect_to(@discussion) }
            format.xml  { render :xml => @discussion, :status => :created, :location => @Discussion }
        else
            format.html { render :action => "new" }
            format.xml  { render :xml => @discussion.errors, :status => :unprocessable_entity }
        end
   end
 end
end


现在,在集成测试文件中,我有:

test "test 1" do
   post "/users/login",:user=> { :name => "bob", :password => "test_pass" }
   post "/discussions/create", :discussion => { :title => "title 1", :body => "discussion body", :id => "101"} #Create 1
   assert_response :success       #Assert 1
   get "/discussions/101"
   assert_response :success       #Assert 2
end


但是,我在断言1上得到一个302

如果我将“创建1”更改为:
    发表“ / discussions / new”,:discussion => {:title =>“ title 1”,:body =>“ discussion body”,:id =>“ 101”}

我收到404错误。

1)这是怎么回事?

2)我可以使用哪些工具/选项,以便自己解决?

谢谢

更新

以下建议(来自Ryan Bigg):


帖子:create,{:discussion => {}},{:user_id => users(:bob).id}


结果:


Rack :: Lint :: LintError:环境变量HTTP_USER_ID具有非字符串值1976283457


仍未解决。

最佳答案

有两件事:


尝试将login_required移至before_filter
为了进行测试,您应该执行post :create, :discussion => { ... }。如果设置正确,则测试应该已经了解控制器。我认为命名约定离我远去。


我想您为什么在断言1上获得302,因为它实际上并未登录。请尝试在调用中将凭据传递给DiscussionsControllerTest

post :create, { :discussion => { } }, { :user_id => users(:bob).id }


post的第二个参数是参数post,第三个参数是会话Hash。假设您已加载用户装置,并且它们具有一个名为bob的密钥,这应该可以找到并使用他登录。

我在RSpec测试中使用的另一种解决方案是定义Hash方法,该方法采用一个我应该以其登录的用户登录名的单个参数。然后,我在控制器或集成测试中所做的每个请求都以该用户身份登录:

def login_as(name)
  request.session[:user] = users(name).id
end


我认为您应该可以在login_as文件中执行相同的操作,但是...我还没有尝试过。 YMMV。

10-07 19:04