我一直在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
这实在是不可思议。任何人都可以分享一些见解,为什么结果不同,取决于我在哪里运行命令/如何处理它?
谢谢!