[rspec-users] Date Approximation in Specs

David Chelimsky dchelimsky at gmail.com
Thu Jan 11 10:44:50 EST 2007


On 1/11/07, s.ross <cwdinfo at gmail.com> wrote:
> My net connection's gone spotty over the last couple of days, but I
> wanted to follow up and tell you that your new code works great.
> Here's just a proof of concept implementation (complete with hard
> coding!):
>
> 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
>        compare_span = target - @target_date
>        adjustment = 0
>        @tolerance.each do |key, amount|
>            case key
>            when :hours
>                adjustment += HOUR_TOLERANCE * amount
>            when :days
>                adjustment += DAY_TOLERANCE * amount
>            when :weeks
>                adjustment += WEEK_TOLERANCE * amount
>            end
>        end
>        return true if compare_span.abs < adjustment
>      end
>
>      def failure_message
>        return "#{@target_date} does not fall within tolerance (#
> {@tolerance.collect{|k,v| "#{k.to_s} => #{v}"}.join(", ")}) from #
> {@compare_date}."
>      end
>    end
>
>    def be_close_to(target_date, tolerance)
>      return BeCloseTo.new(target_date, tolerance)
>    end
> end
>
> context "The DateRange helper" do
>    include DateExpectations
>    specify "should be able to approximate within two days" do
>      1.day.ago.should be_close_to("1/9/2007", :days => 2)
>    end
> end

Great to hear it's working for you.

I just committed support for negative expectations as well. You just
need to supply a negative_failure_message in addition to
failure_message. Then  you can say (given your extension):

3.days.ago.should_not be_close_to("1/10/2007", :days => 2)

I am totally psyched about this. In addition to opening the door to
custom expectations it seems to be leading towards a leaner
implementation in rspec.

Cheers,
David

>
>
> On Jan 10, 2007, at 11:22 AM, David Chelimsky 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. ;)
> >
> > 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
> >>
> > _______________________________________________
> > rspec-users mailing list
> > rspec-users at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/rspec-users
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>


More information about the rspec-users mailing list