This is some of the most verbose code necessary to test two required fields on a model:
# ./spec/models/ignore_user_spec.rb ⋮ describe "required fields" do subject { IgnoredUser.new } it "should have an error message for ignored user id" do subject.valid? subject.errors[:ignored_user_id].first.should_not be_nil end it "should have an error message for user id" do subject.valid? subject.errors[:user_id].first.should_not be_nil end end end ⋮
Imagine if there were more than two fields! Here's an improvement:
# ./spec/models/ignore_user_spec.rb ⋮ describe "#validate" do describe "required field" do subject { IgnoredUser.new } it "should have the expected error messages" do subject.valid? [:ignored_user_id, :user_id].each do |sym| subject.errors[sym].first.should_not be_nil end end end end ⋮
This treats all of the fields as a unit which is less than ideal. Finally if we move the iterative logic outside of the it block we arrive at an elegant solution:
# ./spec/models/ignore_user_spec.rb ⋮ describe "required fields" do subject { IgnoredUser.new } [:ignored_user_id, :user_id].each do |sym| it "should have an error message for #{sym}" do subject.valid? subject.errors[sym].first.should_not be_nil end end end end ⋮