42665


railsアプリでrspecを使って、gemのgeocoderで取得した住所と緯度経度をテストしたいと思っています。

[code]

    # Gemfile
    gem 'geocoder'
    gem 'gmaps4rails'
    
    # pin.rb
    geocoded_by :address
    after_validation :geocode, if: :address_changed?
    
[/code]

Pinにはlatitudeとlongitudeがあります。  
下がschemeのPinです。

[code]

    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
    
[/code]

住所(address)を入力すると、緯度経度を取得することができるようにしています。

[code]

    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: "兵庫県神戸市中央区加納町１丁目３−１",
                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
    
[/code]

Pinには外部キーでuser_idが入っているので、facotrybotでuserのインスタンスを作成しています。  
addressに住所を入力し、その住所の緯度と経度（googlemapからコピペ）をeqの後に書いています。

しかし、上記のコードを書いた後に、bundle exec rspecを行うと、

[code]

    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
    
[/code]

という風になってうまく一致してくれません。  
geocoderで住所を取得すると、特殊な形で緯度経度が返ってくるなんていう仕様があるのでしょうか。

* * *

UPDATE  
sakuroさまのご指摘の上で修正した後のコードです。

[code]

      # 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: "兵庫県神戸市中央区加納町１丁目３−１",
              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
    
[/code]


CC BY-SA 3.0
2018-03-26T15:18:46.183
42664
2018-04-09T05:10:07.593
2018-04-09T05:10:07.593
27892
27892
question
ruby-on-rails rspec
rspec-railsでgemのgeocoderをテストしたい


0.347056201e2 の e2 って指数表記ですよね。値としては 34.7056201 ってことになりますね。  
精度とか測地系の違いであって、特殊な記法の値ではなさそうです。

あと、Floatの比較は[be_within](https://relishapp.com/rspec/rspec-
expectations/v/3-7/docs/built-in-matchers/be-within-matcher)マッチャを使いましょう。


CC BY-SA 3.0
2018-03-27T01:00:28.483
42665
2018-03-27T01:00:28.483
17037
42664
answer