Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 如何测试请求规范的api响应的键和值_Ruby On Rails 4_Capybara_Rspec Rails_Fabrication Gem - Fatal编程技术网

Ruby on rails 4 如何测试请求规范的api响应的键和值

Ruby on rails 4 如何测试请求规范的api响应的键和值,ruby-on-rails-4,capybara,rspec-rails,fabrication-gem,Ruby On Rails 4,Capybara,Rspec Rails,Fabrication Gem,我正在编写请求规范,在测试json格式的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_toke

我正在编写请求规范,在测试json格式的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 

我想我的expecttoJSON_响应是错误的,或者缺少了什么,请有人帮我做得漂亮一点,提示我如何使用键和值进行测试

测试API的最佳方法是使用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

您的测试失败是因为您试图解析一个空响应。结构可能失败,或者调用可能错误。

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

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

为什么要用水豚来测试API?!集成测试用水豚。我认为您应该使用控制器测试来测试API。如果您正在创建一个API,只要capybara是一个行为测试人员,并且您希望测试请求内容,那么集成测试就可以使用rspec完成。问题是API没有返回任何内容。执行“puts response”,您将看到它是空的。仍然获取错误失败/错误:parsed_response=JSON.parse(response.body)NoMethodError:nil:NilClassEmpty response的未定义方法“body”表示您没有body。检查此请求的路线和结构。好的,我深入研究了一下,但你能告诉我为什么我在截图{“折扣券”:[{“id”:11,“代码”:“折扣一”,“类型”:“折扣百分比”,“折扣金额”:1.5,“全局”:真,“过期日”:空,“供应商”:[]}],“页面”:0,“总页数”:1,“总记录”:1}do:将响应放在JSON之前。parse*唯一的更改是将折扣优惠券调用移动到before块。