How do I use expect{}.to change().from().to() on Array?

Hi.

I’m using ruby1.9.2 and rspec2.5.1
I want to use “expect{}.to change().from().to()” like this

When Int class, it passed.
When Ary class, it failed.

Why was Ary test failed and How do I pass this test?

regards.

On Mar 15, 2011, at 10:57 AM, niku -E:) wrote:

Why was Ary test failed and How do I pass this test?
subject.ary returns the same object both times, whereas subject.count
returns different objects each time. Make sense?

On Tue, Mar 15, 2011 at 8:57 AM, niku -E:) [email protected] wrote:

Why was Ary test failed and How do I pass this test?

regards.


rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Your Ary @ary variable is initialized as “[]”. So of course calling
increment on it will change it to “[0]”. For your spec to pass,
initialize
it as “[0]”

On Tue, Mar 15, 2011 at 10:08 AM, Justin Ko [email protected] wrote:

Your Ary @ary variable is initialized as “[]”. So of course calling
increment on it will change it to “[0]”. For your spec to pass, initialize
it as “[0]”

I’m completely wrong. Didn’t read your code properly. Where is the
delete
link? :slight_smile:

I understand that “expect{}.to change()” can’t test “destructive
method”.
So, I should write test like that. correct?

require ‘rspec’

class Ary
attr_reader :ary
def initialize
@count = 0
@ary = []
increment
end
def increment
@ary << @count
@count += 1
end
end

describe Ary, “#ary” do
subject{ Ary.new }
it “should increment the ary” do
# expect { subject.increment }.to change(subject,
:ary).from([]).to([0])
subject.ary.should == [0]
subject.increment
subject.ary.should == [0,1]
end
end

Sorry. Test comment is incorrect.
This is intentional test.

require ‘rspec’

class Ary
attr_reader :ary
def initialize
@count = 0
@ary = []
increment
end
def increment
@ary << @count
@count += 1
end
end

describe Ary, “#ary” do
subject{ Ary.new }
it “should increment the ary” do
# expect { subject.increment }.to change(subject,
:ary).from([0]).to([0,1])
subject.ary.should == [0]
subject.increment
subject.ary.should == [0,1]
end
end

finally, I solved this code.

require ‘rspec’

class Ary
attr_reader :ary
def initialize
@count = 0
@ary = []
increment
end
def increment
@ary << @count
@count += 1
end
end

describe Ary, “#ary” do
subject{ Ary.new }
it “should increment the ary” do
# expect { subject.increment }.to change(subject,
:ary).from([0]).to([0,1]) # fail
expect { subject.increment }.to change{ subject.ary.clone
}.from([0]).to([0,1])
end

it “should increment the ary by [1]” do
expect { subject.increment }.to change{ subject.ary.clone }.by([1])
end
end