belong_to RSpec matcher
April 9, 2008 by Dean
I was extending acts_as_commentable and needed a good RSpec test to check the returned objects from its finder methods belonged to the correct user. For example, Comment.find_comments_by_user( :some_user ) should all belong_to :some_user. I’ll be darned if that doesn’t look like a RSpec description. Since there is no all_belong_to matcher, I wrote one.
-
module ActiveRecordValidations
-
class BelongTo
-
def initialize(expected)
-
@expected = expected
-
end
-
-
def matches?(args)
-
args.all? do |target|
-
@target = target
-
@target.send(@expected.class.to_s.downcase) == @expected
-
end
-
end
-
-
def failure_message
-
"expected #{@target.inspect} to all belong to #{@expected}"
-
end
-
-
def negative_failure_message
-
"expected #{@target.inspect} not to all belong to #{@expected}"
-
end
-
end
-
-
def belong_to(expected)
-
BelongTo.new( [expected] )
-
end
-
-
def all_belong_to(expected)
-
BelongTo.new( expected )
-
end
-
end
The matches? method takes an array of objects and goes through them with all? checking that they have a belongs_to the expected thing. Using the example above, each comment object returned by Comment.find_comments_by_user would get tested if comment.user== @user.
–Dean
