2017-08-03 111 views
1

在我的一個測試中,我必須驗證某個offer是否返回404響應,如果可用限制(例如該offer的10個席位)全部售出,或者它已經到期了,這是第一次。rails請求規格json的PUT方法沒有通過

我只是不能PUT請求中請求規格的工作,這是我的代碼

RSpec.describe "Offers", type: :request do 
    describe "gives not found response" do 

    it "when available limit exhausts before date till available" do 
     offer = Offer.new 
     Timecop.freeze(Date.today - 12.days) do 
      offer = FactoryGirl.create(:offer) 
     end 
     payload = FactoryGirl.attributes_for(:offer, :available_limit => 0, :discount_id => offer.discount.id, :coupon_id => offer.coupon.id) 
     sign_in 
     put '/offers/'<<offer.id, params: { id: offer.id, offer: payload }, as: :json 
     get "/vouchers/"<<offer.coupon.voucher_code 
     expect(response.status).to eq 404 
    end 
    end 
end 

針地說,我已經嘗試了許多黑客攻擊,包括

put '/offers/'<<offer.id.to_s<<".json", params: { offer: payload } 

甚至

put '/offers/'<<offer.id.to_s<<".json", payload 

我還注意到,在其中一個組合中,請求確實通過了,但它響應H兩塊HTML和JSON格式,導致規範錯誤,因爲我不是在水豚運行它們(我不想要麼)

回答

1

我想你想使用format: :jsonas: :json

嘗試:

params = { id: offer.id, offer: payload } 
put :offers, params: params, format: :json 
+1

'format::json'在最近的版本中已經改成'as::json',我不認爲這是因爲那個破壞 –

2

請勿使用<<來構建這些路徑。使用帶有id的<<將插入等於id的整數值的字符碼,例如,

'XYZ' << 123 << 'ABC' 
=> "XYZ{ABC" 

只需使用正常的字符串插值,例如,

put "/offers/#{offer.id}", params: { id: offer.id, offer: payload }, format: :json 
get "/vouchers/#{offer.coupon.voucher_code}" 

感謝@ house9注意format: :json部分。

+2

集成測試的最新穩定分支顯示所有動作調度集成方法指的是一個過程方法,其中籤名具有'as::son'而不是格式,這裏是鏈接https://github.com/rails/rails/blob/0a4d1c3cdeaf387b4cb4288462084c8ee1a9b039/actionpack/lib/action_dispatch/testing/integration.rb#L33 –

+0

'put「/offers/#{offer.id}」,params:{id:offer.id,offer:payload},如::json'那很好用! –