Rails测试将我的int数组转换为字符串数组

时间:2013-11-12 16:37:03

标签: ruby-on-rails ruby post minitest

我对我的控制器上的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”]

这会导致我的测试失败,因为wday必须是一个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

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

如果我无法在测试中使用此功能,我是否应该更改我的验证以允许一串数组?如果我这样做,我应该如何防止像“你好”这样的字符串有效?

这是我目前的验证:

  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

1 个答案:

答案 0 :(得分:1)

您需要指定请求不仅接受JSON(curl中的-H "Accept: application/json",测试中的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'}