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_validThis 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
11 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
spec/spec_helper.rb; is that the right place, or is there a better place to put this?Also, it wouldn’t work with
should_not be_valid. I had to add this:Other 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!
Merci pour le post utile! Je n’aurais pas eu ce le contraire!
This is great, but how does it work now with what’s said here - https://github.com/dchelimsky/rspec/wiki/Custom-Matchers – ?
I’m not sure where to put this code…
(also, shouldn’t this be part of RSpec?)
Here’s an updated matcher for RSpec 2 I found on gist:
https://gist.github.com/820666