2016-03-02 36 views
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 

正如你所看到的,沒有什麼不尋常的:沒有任何地方精度設置。

我試圖直接比較響應的身體也無濟於事。

請問有人請指出正確的方向嗎?謝謝。

回答

0

它看起來像你的數據庫以不同的精度存儲浮動數據 - 在你的規範中,你首先創建一個服務,以一定的精度分配座標,然後你檢查控制器的響應,查詢你的數據庫是否有給定的服務。您的數據庫修剪會浮動,以便您獲得不同精度的響應。

我覺得你有2個可能的解決方案:

  1. 圓你的屬性創建一個使用工廠(service = create(:service, user: user).reload
+0

感謝您的答覆記錄

  • 創建之後刷新您的服務時,卻怎麼了數據庫如果它是相同的記錄將修剪值?如代碼中所述,我首先創建記錄,然後通過控制器獲取它並將其與自身進行比較。儘管如此,我會嘗試儘快重新加載模型的建議。 – Zeh

  • +0

    當你創建一個ActiveRecord對象並將其保存在數據庫中時,只有主鍵被重載(因爲它在大多數情況下由DB分配)。您的float屬性存儲在數據庫中,數據庫的浮點精度可能低於Ruby的浮點精度。這就是爲什麼當您重新載入記錄時價值可能會有所不同。 –

    +0

    謝謝,那正是問題所在。我現在正在研究ActiveRecord驗證,以確保Rails和數據庫中的精度相同。 – Zeh