[rspec-users] [RSpec] Cloning objects and leaking state

Zach Dennis zach.dennis at gmail.com
Wed Jan 28 07:50:21 EST 2009

On Tue, Jan 27, 2009 at 2:48 PM, Nick Hoffman <nick at deadorange.com> wrote:
> G'day folks. I've been beating my head on this one problem for a couple of
> hours, and have managed to figure out what's causing it. However, I don't
> understand why it's happening, nor do I know how to solve or get around it.
> One of my methods clones an arg, and it seems that doing so causes state to
> leak out. I discovered this because changing this:
>  new_subtitle = subtitle.clone
> to this:
>  new_subtitle = subtitle
> causes the problem to disappear.
> Before we get into the code snippets, are there any known caveats, warnings,
> or problems with writing specs that cover the cloning or duplication of
> objects?
> Here's the code, specs, and spec output:
> http://gist.github.com/53482
> As you can see, in the "should clone ..." example, the expectation on line
> 24 succeeds, but the same expectation on line 28 fails. After that, the same
> expectation fails in the "should not leak state" example.

What does your full SubtitleFile class look like? It looks like there
is an issue with how the #subtitles method is storing information.

Since you're using ActiveRecord::BaseWithoutTable there are probably
not going to be any unique primary keys amongst your SubtitleFiles to
help differentiate them. So if #subtitles is a has_many, every call to
SubtitleFile#subtitles may lookup Subtitles in the exact same way w/o
any unique key to use to differentiate which subtitles belong to which
subtitle files which would produce the results you are seeing.

Is Subtitle a ActiveRecord::BaseWithoutTable or a real ActiveRecord::Base model?

> Any idea what's going on? I'd appreciate any help at all. Thanks,
> Nick
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

Zach Dennis

More information about the rspec-users mailing list