2015-11-19 2 views
1

Когда я отправляю объект json, все поля внутри меняются на строку, нарушая мою проверку в контроллере, и я получаю следующую ошибку.Формат Rspec Параметры сообщения для значений String

Api::V1::BillsController POST #create when logged in 
    Failure/Error: post :create, { bill: bill_attributes } 
    Apipie::ParamInvalid: 
     Invalid parameter 'value' value "41.64794235693306": Must be Float 
    # ./app/controllers/concerns/exception_aspects.rb:4:in exception_wrapper 
    # ./spec/controllers/api/v1/bills_controller_spec.rb:135:in block (4 levels) in <top (required)> 

Мой тест я пытаюсь указать request.headers['Content-Type'] = 'application/json'

let(:bill_attributes) { FactoryGirl.attributes_for :bill } 

before(:each) do 
    request.headers['Content-Type'] = 'application/json' 
    post :create, { bill: bill_attributes } 
end 

it "when is valid description" do 
    expect(json_response[:description]).to eq(bill_attributes[:description]) 
end 

Моя фабрика

FactoryGirl.define do 
factory :bill do 
    description { FFaker::Lorem.phrase } 
    value { (rand() * 100).to_f } 
end 
end 

Мой контроллер валидация являются

api :POST, "/bills", "Add a new bill to an event" 
description "Add a new bill" 
param :bill, Hash, :required => true, :action_aware => true do 
    param :description, String, "Bill description" 
    param :bill_photo, Hash, :required => false do 
     param :base64image, String, "Base 64 image file" 
    end 
    param :value, Float, "Amount of the bill" 
end 

Я пытаюсь изменить проверки: значение от Float к :number, но проблема продолжает

Я использую rails 4.2.3 и rspec 3.3.0

+0

Я думал, все параметры представлены как строки. Как будет отображаться поплавок на api? – Swards

+0

@Swards Я пытаюсь отправить объект json '{bill: {description: 'this is description', value: 52.54}}' – German

+0

Если вы посмотрите на хеш params в контроллере, все параметры будут строками. Вы можете проверить, будет ли формат строки действительным float – Swards

ответ

3

Я добавил формат JSON, чтобы отправлять запрос и он работал как шарм

before(:each) do 
    post :create, { bill: bill_attributes, format: :json } 
end 
2
post :create, params: {}, as: :json 

Это то, что работает в Rails 5.0 .3 и rspec-rails 3.6.0

Спецификации контроллера Rails теперь наследуются от ActionD ispatch :: IntegrationTest вместо ActionController :: TestCase. Но спецификации контроллера RSpec по-прежнему используют ActionController :: TestCase, который устарел. Relevant Rails commit here

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