2015-08-26 55 views
0

我一直在Ruby 2.0.0-p481,Rails 4.1.1上的模型助手測試中遇到問題,PostgreSQL 9.4 DB。當試圖創建單元測試(Ruby on Rails)時,在測試和rails控制檯上的不同結果

我的幫手很簡單。它發現我的道臺是最近的(關係將存在)的點(一個或多個),以在輸入的緯度,經度對:

module TractsHelper 

    # returns rows (precalculated data) from the census tract point that is nearest given lat/log location 
    def self.find_nearest(params) 
    raise ArgumentError, 'Must supply starting latitude' unless !params[:lat].nil? 
    raise ArgumentError, 'Must supply starting longitude' unless !params[:lon].nil? 

    nearest = Tract.select(:lat, :lon).order("(lat - #{params[:lat]})*(lat - #{params[:lat]}) + (lon - #{params[:lon]})*(lon - #{params[:lon]})").first 

    if nearest.nil? 
     tracts = Tract.none 
    else 
     tracts = Tract.where({:lat => nearest.lat, :lon => nearest.lon}) 
     #tracts = Tract.order("ST_Distance(POINT(#{params[:lat]}, #{params[:lon]}), POINT(lat, lon))") 
    end 
    return tracts 
    end 

end 

現在,當我試圖寫一個測試,這是我想出了搭配:

class TractsHelperTest < ActionView::TestCase 
    def setup 
      @input_lat = 47.7225472 
      @input_lng = -122.2818937 
    end 

    test "return nearest census tract" do 

     nearest_tract = TractsHelper.find_nearest({:lat => @input_lat, :lon => @input_lng}) 

     assert_equal @input_lat, nearest_tract.first.lat.to_f 
     assert_equal @input_lng, nearest_tract.first.lon.to_f 
    end 
end 

因爲我知道@input_lat和@input_lng的價值觀是一套在我的表點的一對,這應該兩個斷言返回true。不過,我得到:

Finished in 0.200984s, 4.9755 runs/s, 4.9755 assertions/s. 

    1) Failure: 
TractsHelperTest#test_return_nearest_tract [/home/ubuntu/workspace/myapp/test/helpers/tracts_helper_test.rb:13]: 
Expected: 47.7225472 
Actual: 0.0 

1 runs, 1 assertions, 1 failures, 0 errors, 0 skips 

經檢查,nearest_tract確實從區域模型返回了一些成果,但nearest_tract.first.lat值是零,所以是所有其他價值。

有趣的是,當我嘗試使用軌道控制檯複製這一測試,效果不錯:

2.0.0-p481 :118 > @input_lat = 47.7225472 
2.0.0-p481 :119 > @input_lng = -122.2818937 
2.0.0-p481 :120 > nearest_tract = TractsHelper.find_nearest({:lat => @input_lat, :lon => @input_lng}); 
2.0.0-p481 :121 > @input_lat== nearest_tract.first.lat.to_f 
=> true 
2.0.0-p481 :122 > @input_lng== nearest_tract.first.lon.to_f 
=> true 

這實在是不可思議。任何人都可以分享一些見解,爲什麼結果不同,取決於我在哪裏運行命令/如何處理它?

謝謝!

回答

0

它看起來像你的測試依賴於你的數據庫中存儲的內容。

導軌控制檯將使用development數據庫,而測試將使用您的test數據庫,該數據庫可能不同。

要添加對象到您的測試數據庫,您可以使用fixturesfactories

找出測試中發生了什麼的幾個很棒的寶石是byebug(僅限紅寶石2)和pry-remote