1
我正在爲僅以JSON響應的控制器創建RSpec測試文件。 它的工作是將一個Service對象序列化爲一個JSON對象,這非常有效。RSpec中的不同JSON輸出
當我爲控制器創建測試時,我注意到它保持失敗,因爲響應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
是在控制器中使用的相同,因此,它們應該相等。然而,浮領域越來越不同精度:
"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
正如你所看到的,沒有什麼不尋常的:沒有任何地方精度設置。
我試圖直接比較響應的身體也無濟於事。
請問有人請指出正確的方向嗎?謝謝。
感謝您的答覆記錄
當你創建一個ActiveRecord對象並將其保存在數據庫中時,只有主鍵被重載(因爲它在大多數情況下由DB分配)。您的float屬性存儲在數據庫中,數據庫的浮點精度可能低於Ruby的浮點精度。這就是爲什麼當您重新載入記錄時價值可能會有所不同。 –
謝謝,那正是問題所在。我現在正在研究ActiveRecord驗證,以確保Rails和數據庫中的精度相同。 – Zeh