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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です