JSON post Rails的Rspec测试

时间:2016-04-03 21:01:30

标签: ruby-on-rails rspec

Controller:payments_controller.rb

require 'rails_helper'

RSpec.describe PaymentsController, type: :controller do

  describe "#create", :type => :request do 
    let!(:loan) {Loan.create!(id: 1, funded_amount: 500.0)}
    params = '{"payment":{"amount":400, "loan_id":2}}'

    it 'creates and saves a payment while saving the associated fund_amount of the loan' do
      post "/payments", params.to_json, {'CONTENT_TYPE' => 'application/json', 'ACCEPT' => 'application/json'}
      expect(loan.funded_amount).to eql(600.0)
    end
  end
end

当我在Postman中测试时,此方法有效。但是,我似乎无法为它通过测试。我目前有:

payments_controller_spec.rb

Failure/Error: post "/payments", params.to_json, {'CONTENT_TYPE' => 'application/json', 'ACCEPT' => 'application/json'}
 ActionController::ParameterMissing:
   param is missing or the value is empty: payment

错误是:

{"payment":{"amount":400,"loan_id":2}}

有效参数(与Postman一起使用)是:

describe "#create", :type => :request do 
  let!(:loan) {Loan.create!(id: 1, funded_amount: 500.0)}

  it 'creates and saves a payment while saving the associated fund_amount of the loan' do
    json = { :format => 'json', :payment => { :amount => 200.0, :loan_id => 1 } }
    post '/payments', json
    loan.reload
    expect(loan.funded_amount).to eql(300.0)
  end
end

任何帮助将不胜感激!

***更新****

在讨论了一段时间之后,我终于得到了它的工作:

uberTrim = s => s.length >= 2 && (s[0] === s[s.length - 1])?
  s.slice(1, -1).trim() 
  : s;

1 个答案:

答案 0 :(得分:0)

你可以像这样传递你的参数。

it 'creates and saves a payment while saving the associated fund_amount of the loan' do
  post "/payments", payment: { amount: 400, loan_id: 1 }, {'CONTENT_TYPE' => 'application/json', 'ACCEPT' => 'application/json'}
  expect(loan.funded_amount).to eql(600.0)
end