日別アーカイブ: 2012 . 3 / 27

Ruby on Rails 3.2.0 RSpec 2.8.0でActiveRecord::RecordInvalidのテストでargumentの数が違うと怒られる

以下のようにActiveRecord::RecordInvalidのテストをしようと思いました。

let(:person) { mock_model(Person).as_null_object }
it{
Person.should_receive(:find).and_return(person)
person.should_receive(:update_attributes!).and_raise(ActiveRecord::RecordInvalid)

}

が、

ArgumentError:
wrong number of arguments (0 for 1)

と怒られます。なかなか情報がなかったのですが、RecordInvalidクラスがコンストラクタでnewをするときにActiveRecordを引数としてとるらしく、それがないので怒られたようです。下記のようにするとよいです。

person.should_receive(:update_attributes!).and_raise(ActiveRecord::RecordInvalid.new(person))

エラー表示はどのタイミングでエラーが起きたのかというのをもっと詳細に知らせてほしいものです。テストをするといろいろなことが知れて、そういったよい面もありますね。