On Wed, Sep 16, 2009 at 3:34 AM, Ramon Tayag <[email protected]> wrote:
> I put an expectation test, but it complains two things are different
> when it prints it out in the error in the exact same way:
> http://pastie.org/618481
Printing is printing. Time is _not_ time. The problem is that the
times are off by milliseconds that aren't accounted for in time.to_s.
The usual solution is to either stub Time.now or introduce a time
generator, but you're not using Time.now, so that won't work. Options
include:
1. examine the submitted argument directly
@orders.should_receive(:updated_on) do |actual|
expected = 1.week.ago.to_i
actual.to_i.should be_between(expected - 1000, expected)
end
That will expect the time within 1 second of 1.week.ago.
2. introduce a custom argument matcher
class Roughly
def initialize(expected)
@expected = expected.to_i
end
def ==(actual)
actual.to_i.between?(@expected - 1000, @expected)
end
end
def roughly(expected)
Roughly.new(expected)
end
@orders.should_receive(:updated_on).with(roughly(1.week.ago))
And for extra credit, you can even make this one more flexible and
provide a lower and upper bound using a fluent interface:
@orders.should_receive(:updated_on).with(within(1.second).of(1.week.ago))
HTH,
David
>
> or below:
>
> ## the test
> describe ".process_aftersale" do
> before do
> �...@orders = [Order.make, Order.make]
> Order.stub!(:paid).and_return(@orders)
> �[email protected]!(:updated_on).and_return(@orders)
> end
>
> ....
>
> it "should send 1 week after sale letters" do
> �[email protected]_receive(:updated_on).once.with([1.week.ago])
> Order.process_aftersale
> end
>
> ...
> end
>
> ## The error - note that the dates are the same
> 1)
> Spec::Mocks::MockExpectationError in 'Order.process_aftersale should
> send 1 week after sale letters'
> #<Order:0xb4e8b3a4>#<Order:0xb4e69448> expected :updated_on with
> ([Wed, 09 Sep 2009 14:59:59 HKT +08:00]) but received it with ([Wed,
> 09 Sep 2009 14:59:59 HKT +08:00])
> ./spec/models/order_spec.rb:42:
>
>
> ## the method in Order
> def self.process_aftersale
> self.paid.updated_on(1.week.ago).each do |o|
> MailingsWorker.asynch_deliver_order_aftersale_to_inquire(:order_id
> => o.id)
> end
> end
>
> ==============
>
> I may be doing things wrong, so please let me know if I am.
>
> Thanks!
> Ramon Tayag
> _______________________________________________
> rspec-users mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users
>
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users