2016-04-03 3 views
0

Контроллер: payments_controller.rbRspec Тест для JSON разместить Rails

class PaymentsController < ApplicationController 

    # This is needed to have Postman work 
    skip_before_action :verify_authenticity_token 

    rescue_from ActiveRecord::RecordNotFound do |exception| 
    render json: 'not_found', status: :not_found 

    def create 
    new_payment = Payment.new(new_params) 
    current_loan = Loan.find(new_params[:loan_id]) 

    if Payment.valid?(new_payment, current_loan) 
     Payment.received(new_payment, current_loan) 
     current_loan.save 
     new_payment.save 
     redirect_to '/loans' 
    else 
     raise 'Amount entered is above the remaining balance' 
    end 
    end  

end 

Этот метод работает, когда я проверить его в Почтальон. Тем не менее, я не могу написать тест для него, который проходит. Я в настоящее время:

payments_controller_spec.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 

Ошибка:

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 

Допустимые параметры (которые работают с Postman) являются:

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

Любая помощь будет оценили!

*** UPDATE ****

После возни с этим на некоторое время, я, наконец, получил его на работу с этим:

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 
+0

'current_loan = Loan.find (new_params [: loan_id]) если Payment.valid (new_payment, current_loan)' им просто интересно, как у проходя весь объект? – 7urkm3n

ответ

0

Вы можете передать в своем Params, как это.

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 
+0

Спасибо Энтони. Я не думаю, что ему нравится платеж: {amount: 400, loan_id: 1}, не находясь в кавычках. Я получаю эту ошибку: Desktop/payments_challenge/spec/controllers/payments_controller_spec.rb: 10: синтаксическая ошибка, неожиданный '\ n', expecting => (SyntaxError) – user3007294

+0

Хм вы можете попробовать? '{payment: {amount: 400, loan_id: 1}}' –

+0

По-прежнему не работает: / – user3007294

Смежные вопросы