rspec应该为POST请求分配工作吗?

时间:2016-06-02 17:12:06

标签: ruby-on-rails-4 post rspec controller

我正在使用rspec 3.4为我的Rails 4.2.5控制器编写rspec测试。我有一个控制器方法正在创建@position,然后渲染一个使用来自@position的数据的感谢页面。网页似乎都正确呈现,但我的rspec测试失败,因为它似乎无法识别@position对象已传递到感谢页面。

控制器方法是:

def create_application
  application = Application.new application_params
  application.save
  @position = application.position
  render "thank_you"
end

rspec示例是:

it "renders the Thank You page for a successful application." do
  position = create :position
  application = build :application, position: position
  post :create_application, application: application.attributes
  expect(response).to render_template("thank_you")
  expect(response).to have_http_status(:success)
  expect(assigns(:position)).to eq(position)
end

我一直看到的结果是:

 Failure/Error: expect(assigns(:position)).to eq(position)

   expected: #<Position id: 422, title: "Position Title", description: "This is a description of the position", status: "open", company_id: nil, created_at: "2016-06-02 16:47:19", updated_at: "2016-06-02 16:47:19">
        got: nil

   (compared using ==)

因此看来rspec没有将@positiion变量识别为已设置。但是,感谢页面使用@position对象的属性,当我手动测试页面时,这些属性会正确显示。

我有其他类似的GET请求规范,它们似乎都没有任何问题。分配应该与POST请求一起使用吗?

1 个答案:

答案 0 :(得分:0)

我发现了我的问题。由于用于向控制器提交数据的表单不使用标准的Rails REST模式,因此它将每个字段作为请求参数提交。换句话说,控制器动作是单独接收每个字段而不是作为对象属性。这对网页很好用,因为它们编码正确。但是,rspec示例是将参数作为应用程序对象的一部分发送。

我更改了rspec示例的这一行:

post :create_application, application: application.attributes

为:

post :create_application, application.attributes

现在一切正常。