Я создаю тестовые файлы RSpec для контроллера, который отвечает только в JSON. Задача состоит в сериализации объекта Service в объекте JSON, который работает очень хорошо.Различные выходные JSON в RSpec
Пока я создавал тест для контроллера, я заметил, что он не работает, потому что ответ JSON отличается от точности, чем Rails.
describe "getting a service detail" do
it "should succeed when a valid id is supplied" do
service = create(:service, user: user)
get(:show, id: service.id, format: :json)
expect(response).to have_http_status(200)
result = JSON.parse(response.body)
expect(result).to_not be_nil
expect(result).to eq(service.api_json().to_json)
end
end
Метод api_json
та же, что используется в контроллере, поэтому они должны быть равны. Однако поля поплавка получают различные Precisions:
"latitude":73.1379129975533,"longitude":170.75011612037 # Controller Response
"latitude":73.13791299755334,"longitude":170.75011612037048 # RSpec comparison
Это как контроллер выводит объект:
def show
begin
@service = @api_user.services.includes(task: :address).find(params[:id])
respond_with @service do |format|
format.json { render json: @service.api_json }
end
rescue ActiveRecord::RecordNotFound
render nothing: true, status: 404
end
end
Как вы видите, ничего необычного: нет точности установить в любом месте.
Я пытаюсь сравнить Тело Ответа непосредственно также безрезультатно.
Не могли бы вы указать мне в правильном направлении, пожалуйста? Спасибо.
Спасибо за ответ, но как мог DB может обрезать значения, если это одна и та же запись? Как отмечено в коде, я сначала создаю запись, затем я получаю ее через контроллер и сравниваю ее с самим собой. Я попробую ваше предложение перезагрузить модель, как только смогу. – Zeh
Когда вы создаете объект ActiveRecord и сохраняете его в базе данных, перезагружается только первичный ключ (поскольку в большинстве случаев он назначается БД). Ваш атрибут float хранится в базе данных с точностью до float вашей базы данных, которая может быть ниже точности float Ruby. Поэтому при перезагрузке вашей записи значение может отличаться. –
Спасибо, это была именно проблема. Теперь я просматриваю проверки ActiveRecord, чтобы гарантировать, что точность одинакова как в Rails, так и в DB. – Zeh