我对我的控制器上的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
答案 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'}