[rspec-users] Date Approximation in Specs

David Chelimsky dchelimsky at gmail.com
Wed Jan 10 14:40:27 EST 2007


On 1/10/07, David Chelimsky <dchelimsky at gmail.com> wrote:
> On 1/10/07, David Chelimsky <dchelimsky at gmail.com> wrote:
> > On 1/10/07, s.ross <cwdinfo at gmail.com> wrote:
> > > I upgraded to trunk and changed the code as follows:
> > >
> > > module DateExpectations
> > >      HOUR_TOLERANCE = 60 * 60
> > >      DAY_TOLERANCE = HOUR_TOLERANCE * 24
> > >      WEEK_TOLERANCE = DAY_TOLERANCE * 7
> > >
> > >    class BeCloseTo
> > >      def initialize(target_date, tolerance)
> > >        @target_date = Time.parse(target_date)
> > >        @tolerance = tolerance
> > >      end
> > >
> > >      def met_by?(target)
> > >        compare_date = target - @target_date
> > >        adjustment = @tolerance.inject do |item|
> > >            case item
> > >            when :days
> > >                adjustment += DAY_TOLERANCE
> > >            when :weeks
> > >                adjustment += WEEK_TOLERANCE
> > >            end
> > >        end
> > >        return true if compare_date.abs < adjustment
> > >      end
> > >
> > >      def failure_message
> > >        return "#{@target_date} does not fall within tolerance."  # s/
> > > b better
> > >      end
> > >    end
> > >
> > >    def should_be_close_to(target_date, tolerance)
> > >      return BeCloseTo.new(target_date, tolerance)
> > >    end
> > > end
> > >
> > > context "My package" do
> > >    include DateExpectations
> > >    specify "should be delivered no later than 2 days after my order" do
> > >      1.day.ago.should_be_close_to("1/9/2007", :days => 2)   # <- line 40
> > >    end
> > > end
> > >
> > > The result is:
> > >
> > > 1)
> > > NoMethodError in 'My package should be delivered no later than 2 days
> > > after my order'
> > > undefined method `close_to?' for Tue Jan 09 10:59:31 -0800 2007:Time
> > > ./spec/helpers/date_range_spec.rb:40:
> > >
> > >
> > > Any thoughts as to why? (Note: You had written the expectation in
> > > your sample as:
> > > "should<space>be_close_to" -- was that intentional?).
> >
> > Yes!!!! That's the whole point. ;)
>
> I should clarify that a bit. The idea is to decouple expectations from
> Object so that we can more easily write, maintain and extend them
> while simultaneously minimizing the risk of other frameworks (like
> rails) screwing w/ our use of method missing.
>
> If you look at the initialize method in should.rb, it now takes an
> optional expectation argument. If it gets one, it processes it. What
> you are writing is an expectation that gets passed to should, which
> then passes the target to the expectation for verification.
>
> Make sense?

I blogged about this here:
http://blog.davidchelimsky.net/articles/2007/01/10/rspec-should-use_a_little_less_magic

Comments welcome and appreciated.

Thanks,
David


>
> David
>
> >
> > should be_close_to
> >
> > and your method should be named be_close_to
> >
> > Let me know how it works out.
> >
> > Thanks for giving this a shot - you're the guinea pig!
> >
> > David
> >
> > >
> > > Steve
> > >
> > >
> > > On Jan 9, 2007, at 8:26 PM, David Chelimsky wrote:
> > >
> > > > module DateExpectations
> > > >   class BeCloseTo
> > > >     def initialize(target_date, tolerance)
> > > >       @target_date = target_date
> > > >       @tolerance = tolerance
> > > >     end
> > > >
> > > >     def met_by?(target)
> > > >       #return true if target is a date
> > > >       #that meets the expectation
> > > >     end
> > > >
> > > >     def failure_message
> > > >       #return an appropriate failure message
> > > >     end
> > > >   end
> > > >
> > > >   def should_be_close_to(target_date, tolerance)
> > > >     return BeCloseTo.new(target_date, tolerance)
> > > >   end
> > > > end
> > > >
> > > > context "My package" do
> > > >   include DateExpectations
> > > >   specify "should be delivered no later than 2 days after my order" do
> > > >     delivery_date.should be_close_to("1/9/2007", :days => 2)
> > > >   end
> > > > end
> > >
> > > _______________________________________________
> > > rspec-users mailing list
> > > rspec-users at rubyforge.org
> > > http://rubyforge.org/mailman/listinfo/rspec-users
> > >
> >
>


More information about the rspec-users mailing list