rspec: model.should be_valid
One of the things I always check when spec’ing is that the model that I just created is valid.
@mymodel.should be_valid
This uses RSpec’s predicate support (any call to be_something? calls something? on the target object), and returns a correct but very unhelpful error:
expected valid? to return true, got false
Here is a little rspec matcher that I threw together this morning to check if a model is valid and spit out the validation errors:
module Spec
module Rails
module Matchers
class BeValid #:nodoc:
def matches?(model)
@model = model
@model.valid?
end
def failure_message
"#{@model.class} expected to be valid but had errors:\n #{@model.errors.full_messages.join("\n ")}"
end
def negative_failure_message
"#{@model.class} expected to have errors, but it did not"
end
def description
"be valid"
end
end
def be_valid
BeValid.new
end
end
end
end
Now, I get:
MyModel expected to be valid but had errors: Password confirmation can't be blank Email has already been taken
This is nothing fancy, but it’s the small stuff that make life meaningful, so I thought I would share it. Throw the matcher code above into your spec_helper and check if your models are valid.
update: added negative_failure_message so “model.should_not be_valid” will work
8 comments
Perfect use of custom matchers! Nice.
Cheers, David
Ah… that’s how be_valid works. Newly generated model specs use the be_valid method, but I couldn’t find any documentation for it. Thanks for the heads up!
I threw this into
Also, it wouldn’t work withspec/spec_helper.rb; is that the right place, or is there a better place to put this?should_not be_valid. I had to add this:def negative_failure_message "#{@model.class} expected to be invalid but was valid.\n" endOther than that, it’s been a great help in finding the source of problems when the results are not as I was expecting.
Would be nice to see this as part of the rspec rails plugin. Did you already submit a patch for it?
Thanks for the addition. Much appreciated.
nice one
thanks
thanks! this is great!
Speak your mind: