地方でリモートワーク in Iwate

東京の受託開発会社でリモートワークしてます。

Railsのboolean型の挙動でRspecのcontrollerのupdateのテストでハマった

スポンサーリンク

Railsは

boolean number
true 1
false 0

としてboolean型を扱うようです。

viewのチェックボックスで、1と0のそれぞれを値として与えていました。

<%= f.radio_button :require_auth, 1, checked: @page.auth %> %>
<%= f.radio_button :require_auth, 0, checked: @page.auth.blank? || !page.require_auth %>

これで上記の表のように変換されることは知っていたのですが、Rspecのテストでも変換されるのでexpectに与えるものに気をつける必要がありますね。

  describe "PATCH #update" do
    let(:page) { create(:page) }
    before do
      @edit_attr = page.attributes
      @edit_attr[:url] = 'change'
      @edit_attr[:title] = 'change_title'
      @edit_attr[:body] = 'change_body'
      @edit_attr[:auth] = 1 #これがtrueに変換される
    end
    subject { patch :update, id: page.id, page: @edit_attr }

    it "変更が反映されていること" do
      subject
      page = Page.find(page.id)
      expect(page).to have_attributes(
       url: @edit_attr[:url],
       title: @edit_attr[:title],
       body: @edit_attr[:body],
       auth: true) #ここを他と同じように@edit_attr[:auth]にすると1→trueに変換されるのでerrorが起きる。
    end
  end

1で代入してもtrueに変換されるので、expectでもtrueを参照する必要がありますね!

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails