こんにちは!kossyです!
さて、今回はAPIモードで実装されたRailsのRequestSpecを書く際に、
iso8601メソッドを使ってcreated_atのテストを通す方法について、ブログに残してみたいと思います。
環境
Ruby 2.5.1
Rails 6.0.2.1
MacOS Mojave
普通に比較すると通らない
require 'rails_helper' RSpec.describe 'Pokemon API', type: :request do describe 'index' do it '' do create_list(:pokemon, 50) pokemon = Pokemon.first get '/pokemons' expect(response.status).to eq 200 json = JSON.parse(response.body) pokemon_json = json[0] expect(pokemon_json['created_at']).to eq pokemon.created_at end end end
上記のようなテストがあったとして、
expect(pokemon_json['created_at']).to eq pokemon.created_at
この書き方をすると、
expected: 2020-03-18 21:59:31.000000000 +0900 got: "2020-03-18T21:59:31.000+09:00"
日付の中身がちゃうやん!と怒られてしまいます。
そこで登場するのが、DateTimeクラスのインスタンスメソッドであるiso8601です。
iso8601 (DateTime) - APIdock
ISO8601についてはこちらが詳しかったです。
ISO 8601 - Wikipedia
このメソッドを、
expect(pokemon_json['created_at']).to eq pokemon.created_at.iso8601(3)
このようにcreated_atに適用します。
すると、
should eq "2020-03-18T22:04:09.000+09:00"
このように、テストをパスすることができます。
勉強になりました。