Trouble passing RSpec test. Time can't be coerced into Fixnum

rspec, ruby

Solution

`total = total + stop - start` is not the same as `total = total + (stop - start)`

The first is actually evaluating as `total = (total + t) - n` which doesn't work since you can't add two times together.

I think what you mean to do is:

`total = total + (stop - start)` or a more concise `total += stop - start`

Problem

I'm having trouble with this rspec test. I'm using Ruby 1.93 and RSPEC 2.14.8 (I think) Sorry for how long this post will be. I can get the other code that I found to work but I cannot get my code to work and I'm not sure why. My code: ``` def measure(number = 1) counter = number total = 0 while counter > 0 start = Time.now counter-=1 yield stop = Time.now total = total + stop - start end total / number end ``` Other code that I found that works: ``` def measure count=1 total_time = 0 count.times do start_time = Time.now yield end_time = Time.now total_time += end_time - start_time end total_time / count end ``` The test: ``` require_relative "performance_monitor" require "time" # loads up the Time.parse method -- do NOT create time.rb! describe "Performance Monitor" do before do @eleven_am = Time.parse("2011-1-2 11:00:00") end it "takes about 0 seconds to run an empty block" do elapsed_time = measure do end elapsed_time.should be_within(0.1).of(0) end it "takes exactly 0 seconds to run an empty block (with stubs)" do Time.stub(:now) { @eleven_am } elapsed_time = measure do end elapsed_time.should == 0 end it "takes about 1 second to run a block that sleeps for 1 second" do elapsed_time = measure do sleep 1 end elapsed_time.should be_within(0.1).of(1) end it "takes exactly 1 second to run a block that sleeps for 1 second (with stubs)" do fake_time = @eleven_am Time.stub(:now) { fake_time } elapsed_time = measure do fake_time += 60 # adds one minute to fake_time end elapsed_time.should == 60 end it "runs a block N times" do n = 0 measure(4) do n += 1 end n.should == 4 end it "returns the average time, not the total time, when running multiple times" do run_times = [8,6,5,7] fake_time = @eleven_am Time.stub(:now) { fake_time } average_time = measure(4) do fake_time += run_times.pop end average_time.should == 6.5 end it "returns the average time when running a random number of times for random lengths of time" do fake_time = @eleven_am Time.stub(:now) { fake_time } number_of_times = rand(10) + 2 average_time = measure(number_of_times) do delay = rand(10) fake_time += delay end average_time.should == (fake_time - @eleven_am).to_f/number_of_times end end ``` What it says when I run it: Performance Monitor takes about 0 seconds to run an empty block (FAILED - 1) Failures: 1) Performance Monitor takes about 0 seconds to run an empty block Failure/Error: elapsed_time = measure do TypeError: Time can't be coerced into Fixnum # ./06_performance_monitor/performance_monitor.rb:11:in '+' #./06_performance_monitor/performance_monitor.rb:11:in 'measure' #./06_performance_monitor/performance_monitor_spec.rb:21:in `block (2 levels) in ' Finished in 0.008 seconds 1 example, 1 failure

Original source