rspec-railsでgemのgeocoderをテストしたい
railsアプリでrspecを使って、gemのgeocoderで取得した住所と緯度経度をテストしたいと思っています。
# Gemfile
gem 'geocoder'
gem 'gmaps4rails'
# pin.rb
geocoded_by :address
after_validation :geocode, if: :address_changed?
Pinにはlatitudeとlongitudeがあります。
下がschemeのPinです。
create_table "pins", force: :cascade do |t|
t.string "pin_name"
t.string "address"
t.decimal "latitude", precision: 23, scale: 20
t.decimal "longitude", precision: 23, scale: 20
t.text "description"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["user_id"], name: "index_pins_on_user_id"
end
住所(address)を入力すると、緯度経度を取得することができるようにしています。
require 'rails_helper'
RSpec.describe Pin, type: :model do
before do
@user = FactoryBot.create(:user)
end
# valid when the corresponded address is got with latitude and longitude
it "is valid when the address is got with latlng" do
user = @user
new_pin = user.pins.create(
pin_name: "new_pin",
address: "兵庫県神戸市中央区加納町1丁目3−1",
description: "search with latlng",
user_id: 1
)
Pin.geocoded_by :address
expect(new_pin.latitude).to eq 34.706705
expect(new_pin.longitude).to eq 135.195490
end
end
Pinには外部キーでuser_idが入っているので、facotrybotでuserのインスタンスを作成しています。
addressに住所を入力し、その住所の緯度と経度(googlemapからコピペ)をeqの後に書いています。
しかし、上記のコードを書いた後に、bundle exec rspecを行うと、
Failures:
1) Pin is valid when the address is got with latlng
Failure/Error: expect(new_pin.latitude).to eq 34.706705
expected: 34.706705
got: 0.347056201e2
(compared using ==)
# ./spec/models/pin_spec.rb:97:in `block (2 levels) in <top (required)>'
Finished in 5.03 seconds (files took 3.96 seconds to load)
26 examples, 1 failure
Failed examples:
rspec ./spec/models/pin_spec.rb:88 # Pin is valid when the address is got with latlng
という風になってうまく一致してくれません。
geocoderで住所を取得すると、特殊な形で緯度経度が返ってくるなんていう仕様があるのでしょうか。
UPDATE
sakuroさまのご指摘の上で修正した後のコードです。
# valid when appropreate latlng is received with an address
it "is valid when appropreate latlng is received with an address" do
user = @first_user
new_pin = user.pins.create(
pin_name: "new_pin",
address: "兵庫県神戸市中央区加納町1丁目3−1",
description: "search with latlng",
user_id: 1
)
Pin.geocoded_by :address
lat = new_pin.latitude.to_f
lng = new_pin.longitude.to_f
expect(lat).to be_within(0.005).of 34.706705
expect(lng).to be_within(0.005).of 135.195490
end