Depends on ActiveModel (and implictly on ActiveRecord for the check_all_columns functioality).
After building a factory that fills out all the attributes (columns) of an ActiveRecord model, I want to make sure all attributes/columns actually have data.
This aids in avoiding the gotcha where a belongs_to has a name that is not exactly matching with the _id column, which goes undetected in many naive tests (a simple build on the belongs_to will pass, a save will pass, a reload and reading back the belongs_to will pass and indicate correct values (because reload does not touch values that are not actually columns). Reading all the _id columns is one way to detect this issue.
describe Contact do it "has all columns for a full factory" do contact = FactoryGirl.create(:full_contact) contact = Contact.find(contact.id) check_all_columns(contact) end end
In default Rspec controller specs, default values are required. A nice way to produce them automatically from the FactoryGirl factories is:
def valid_attributes FactoryGirl.build(:full_contact).attributes.delete_nil_values end
The reason the nil values need to be removed is to allow some default key (e.g. created_at etc.) to be set by ActiveRecord when executing the create in the controller. Specifically, without the delete_nil_values, this error results:
null value in column "created_at" violates not-null constraint
is a combined function that executes
shown above as valid_attributes on a ActiveRecord model (typically produced with FactoryGirl)
in a spec do:
class String include SpecSupport::QueryParams end URI.unescape(rendered).should have_query_params( "f[key]", "value+with+spaces")
in a spec do:
subject.errors.should have_error_key(:name, :blank)
to validate that the “name” attribute violates the presence validation (and has exactly that error).