2014-06-25 37 views
1

我正在写请求规格,并且在测试api中响应json formate时遇到问题。我使用水豚制造者,这里是我的代码,我想...如何测试请求规格的API响应的键和值

context 'discounts in api' do 
     let(:user) { Fabricate(:user, activated: true) } 
     let(:api_token) { user.api_token } 

     before { visit api_url_for('/v1/discount_coupons', api_token) } 

     it 'returns coupons collection' do 
     Fabricate(:discount_coupon, code: 'Discount One', global: true) 

     save_screenshot("tmp/capybara/screenshot-#{Time::now.strftime('%Y%m%d%H%M%S%N')}.png") 
     save_and_open_page 


     expect(json_response['total_records']).to eq 1 
     expect(json_response['total_pages']).to eq 1 
     expect(json_response['page']).to eq 0 
     expect(json_response['discount_coupons'].size).to eq 1 
     expect(json_response['discount_coupons'][0]['code']).to eq 'Discount One' 
     end 
end 

我获得性反应是这

{"discount_coupons":[{"id":11,"code":"Discount One","type":"DiscountPercentage","amount_off":1.5,"global":true,"expires_on":null,"vendors":[]}],"page":0,"total_pages":1,"total_records":1} 

和错误去阻止我的一个运行成功测试,

Failure/Error: expect(json_response['total_pages']).to eq 1 
      NoMethodError: 
       undefined method `body' for nil:NilClass 

我想我的期望json_response是错误的或缺少的东西,可以somone帮助我这样做英俊的方式,暗示我该如何测试使用键和值。测试一个API

+0

你为什么要用水豚做测试API?水豚进行整合测试。我认为你应该使用控制器测试来测试API。 – gotva

+0

只要您的行为测试人员是水豚,并且您想要测试请求内容,就可以使用rspec完成集成测试。 – tebayoso

回答

1

最好的办法是使用RSpec的,你只需要做到这一点:

it "should return the expected information" do 
    get "/url" 

    parsed_response = JSON.parse(response.body) 
    expect(parsed_response["key"]).to eq(whatever) 
end 

it "should update the expected entity" do 
    post "/url", body, headers 

    parsed_response = JSON.parse(response.body) 
    expect(parsed_response["key"]).to eq(whatever) 
end 

而且你的测试失败,因为你正在试图解析是空的响应。 Fabric可能失败或者调用可能是错误的。

+0

然后问题是API没有返回任何东西。做“回应”,你会看到这是空的。 – tebayoso

+0

仍然出现错误 失败/错误:parsed_response = JSON.parse(response.body) NoMethodError: 未定义的方法'body'为零:NilClass – Awais

+0

空响应表示您没有身体。检查此请求的路由和结构。 – tebayoso

0

我认为这个问题可能是您正在访问前一个页面的页面,然后在断言块中生成折扣优惠券。尝试像这样移动代码,看看它是否会产生更好的结果。

context 'discounts in api' do 
    let(:user) { Fabricate(:user, activated: true) } 
    let(:api_token) { user.api_token } 

    before do 
    Fabricate(:discount_coupon, code: 'Discount One', global: true) 
    visit api_url_for('/v1/discount_coupons', api_token) 
    end 

    it 'returns coupons collection' do 
    save_screenshot("tmp/capybara/screenshot-#{Time::now.strftime('%Y%m%d%H%M%S%N')}.png") 
    save_and_open_page 

    expect(json_response['total_records']).to eq 1 
    expect(json_response['total_pages']).to eq 1 
    expect(json_response['page']).to eq 0 
    expect(json_response['discount_coupons'].size).to eq 1 
    expect(json_response['discount_coupons'][0]['code']).to eq 'Discount One' 
    end 
+0

*只有改变是移动折扣优惠券编造调用到前面的块。 –

+0

是的,我会去做,谢谢。 – Awais

相关问题