2016-03-02 3 views
1

Я создаю тестовые файлы 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 

Как вы видите, ничего необычного: нет точности установить в любом месте.

Я пытаюсь сравнить Тело Ответа непосредственно также безрезультатно.

Не могли бы вы указать мне в правильном направлении, пожалуйста? Спасибо.

ответ

0

Похоже, что ваша база данных хранит поплавки с различной точностью - в вашем представлении вы сначала создаете службу, назначая координаты с некоторой точностью, тогда вы проверяете ответ от вашего контроллера, который запрашивает вашу БД для данной службы , Ваши планки DB плавают, так что вы получаете ответ с различной точностью.

Я думаю, что у вас есть 2 возможных решения:

  1. Круглый ваших атрибутов при создании записей с помощью фабрики
  2. перезарядить службу после создания (service = create(:service, user: user).reload)
+0

Спасибо за ответ, но как мог DB может обрезать значения, если это одна и та же запись? Как отмечено в коде, я сначала создаю запись, затем я получаю ее через контроллер и сравниваю ее с самим собой. Я попробую ваше предложение перезагрузить модель, как только смогу. – Zeh

+0

Когда вы создаете объект ActiveRecord и сохраняете его в базе данных, перезагружается только первичный ключ (поскольку в большинстве случаев он назначается БД). Ваш атрибут float хранится в базе данных с точностью до float вашей базы данных, которая может быть ниже точности float Ruby. Поэтому при перезагрузке вашей записи значение может отличаться. –

+0

Спасибо, это была именно проблема. Теперь я просматриваю проверки ActiveRecord, чтобы гарантировать, что точность одинакова как в Rails, так и в DB. – Zeh

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