RequestSpecを書く際にiso8601メソッドを使ってcreated_atのテストを通す

こんにちは!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"

このように、テストをパスすることができます。




勉強になりました。