Testing ordering with each_cons
This is based on a bit of interesting code I observed the other day. In Ruby, the each_cons Array method allows you execute a block on an array of n-consecutive elements. For example:
> (1..10).each_cons(2) {|a| p a}
[1, 2]
[2, 3]
[3, 4]
[4, 5]
[5, 6]
[6, 7]
[7, 8]
[8, 9]
[9, 10]
=> nil
This is especially handy if you want to test sorting. Suppose we have the following ActiveRecord::Base subclass:
class BlogPost < ActiveRecord::Base
attr_accessible :title
scope :by_title, order('title ASC')
end
In order to test that our :by_title scope sorts correctly, we can check that the first element in every each_cons is less than or equal to the second:
describe BlogPost do
before {
BlogPost.create(title: 'Blog Post A')
BlogPost.create(title: 'Blog Post B')
BlogPost.create(title: 'Blog Post C')
}
describe ".by_title" do
subject { BlogPost.by_title }
it "should return ordered blog posts" do
subject.each_cons(2) do |a, b|
a.title.should be <= b.title
end
end
end
end
Nothing Earth-shattering, but I thought it was pretty neat.
Written by Ben Burton
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Ruby
Authors
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#