代码之家  ›  专栏  ›  技术社区  ›  cbrulak

集成测试:在控制器中创建与新建

  •  1
  • cbrulak  · 技术社区  · 16 年前

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

    我有一个控制器,有两个功能:

     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
    

    但是,我得到一个 302 关于断言1。

    如果我将“创建1”更改为: 发布“/讨论/新建”,:讨论=>:标题=>“标题1”,:正文=>“讨论正文”,:id=>“101”

    我得到一个404错误。

    1)发生了什么事?

    2)我可以使用哪些工具/选项来解决这个问题?

    谢谢

    更新

    遵循的建议(来自Ryan Bigg):

    • 发布:创建,:讨论=>,:用户_id=>用户(:bob).id

    结果:

    • rack::lint::linterror:env变量http_user_id具有非字符串值1976283457

    仍未解决。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Ryan Bigg Andrés Bonilla    16 年前

    一些事情:

    1. 尝试将登录名移动到 before_filter .
    2. 你应该做的测试 post :create, :discussion => { ... } . 如果设置正确,测试应该已经知道控制器的情况。我相信命名惯例是 DiscussionsControllerTest 从我的头顶上。

    我想你为什么在断言1上得到302,因为它实际上没有登录。尝试将呼叫中的凭据传递给 post 以下内容:

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

    第二个论点 邮递 是PARAMS Hash 第三个论点是会议 搞砸 . 如果您已经加载了用户设备,并且它们有一个名为bob的密钥,那么应该找到该密钥并使用它登录。

    我在我的 RSPEC 测试将定义 login_as 方法,该方法采用我应该以其身份登录的用户的登录名的单个参数。然后,我在控制器或集成测试中执行的每个请求都作为该用户登录:

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

    我认为你应该能做同样的事情 test_helper.rb 文件,但是…我没试过。YMMV。

        2
  •  0
  •   Tomas Markauskas    16 年前

    你的控制器似乎一切正常。在您的测试中,您发送了一个POST请求, new 操作不接受POST请求,但只接受GET请求。 create 操作接受post,但它在成功创建讨论后发送重定向。

    你应该把第一个换掉 assert_response :success 用:

    assert_redirected_to :controller => "discussions", :action => "show"`