I didn't run these specs (but I played with the examples on 1.9.3), so you should. :) The point is to separate the different facets of behavior into their own examples and use the simplest code. Also, use code that describes what is being tested. The concept of "initial state" appears to have no relevance if I passed e.g. "" or Object.new as an argument to #chunk.

<pre>
it "yields an element and the object passed to chunk to a block" do
  e = EnumerableSpecs::Numerous.new(1)
  result = e.chunk("") { |*x| x.should == [1, ""]; :x }
  result.to_a.should == [[:x, [1]]]
end

it "calls #dup on the object passed to chunk" do
  obj = mock("enumerable_chunk_argument")
  obj.should_receive(:dup).and_return(obj)
  e = EnumerableSpecs::Numerous.new(1)
  e.chunk("") { |*x| x.last.should equal(obj) }
end

it "yields only the elements to the block if no argument is passed to #chunk" do
  e = EnumerableSpecs::Numerous.new(1)
  e.chunk { |*x| x.should == [1] }
end

it "does not yield the object passed to #chunk if it is nil" do
  e = EnumerableSpecs::Numerous.new(1)
  e.chunk(nil) { |*x| x.should == [1] }
end
</pre>