【问题标题】:Should rspec assigns work for a POST request?rspec 应该为 POST 请求分配工作吗?
【发布时间】:2016-06-02 17:12:06
【问题描述】:

我正在使用 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 请求一起使用?

【问题讨论】:

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


    【解决方案1】:

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

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

    post :create_application, application: application.attributes
    

    到:

    post :create_application, application.attributes
    

    现在一切正常。

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      相关资源
      最近更新 更多