我正在使用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请求一起使用吗?
答案 0 :(得分:0)
我发现了我的问题。由于用于向控制器提交数据的表单不使用标准的Rails REST模式,因此它将每个字段作为请求参数提交。换句话说,控制器动作是单独接收每个字段而不是作为对象属性。这对网页很好用,因为它们编码正确。但是,rspec示例是将参数作为应用程序对象的一部分发送。
我更改了rspec示例的这一行:
post :create_application, application: application.attributes
为:
post :create_application, application.attributes
现在一切正常。