0

我对控制器上的 create 方法进行了以下测试

  before :each do
    request.env["HTTP_ACCEPT"] = 'application/json'
    request.env["CONTENT_TYPE"] = "application/json"

  end

  test "should post create" do
    params = {
      trip_id: 1,
      schedule: {
        price: 12.50,
        max_size: 1,
        time: "11:00 am",
        wdays: [0,1]
      }
    }

    post :create, params
    assert_response :success
  end

当这达到我的创建方法时, params[:schedule][:wdays] 从 [0,1] 更改为 ["0", "1"]

这会导致我的测试失败,因为 wdays 必须是一个 int 数组。我曾考虑在验证中做一个 .to_i ,但这将允许 ["hello", "world"] 变为 [0,0]。

奇怪的是,这个 curl 命令,我认为它会做同样的事情,工作得很好

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"trip_id":1, "schedule":{"price":12.50,"max_size":1,"wdays":[0,1],"time":"11:00 am"}}' http://localhost:3000/trips/1/schedules

如何让我的测试像 curl 一样将数组保留为 int 数组?

如果我不能让这个功能在测试中正常工作,我应该更改我的验证以允许一串数组吗?如果我这样做,我应该如何防止像“hello”这样的字符串有效?

这是我目前的验证:

  def valid_wdays
    if !wdays.is_a?(Array) || wdays.detect { |d| !(0..6).include?(d) }
      errors.add(:wdays, "should be an array of ints represeting days of the week")
    end
  end
4

1 回答 1

1

您需要指定请求不仅接受 JSON(-H "Accept: application/json"在 curl 中,request.env["HTTP_ACCEPT"] = 'application/json'在测试中),而且将数据作为 JSON 发送(-H "Content-type: application/json"在 curl 中,在测试中没有任何内容)。

尝试类似的东西

post :create, params.to_json, format: :json

或者

post :create, params.to_json, {'CONTENT_TYPE' => 'application/json'}
于 2013-11-12T17:03:25.073 回答