Sure!
Here's the Gist:

https://gist.github.com/940868

It's works in Rspec 2.5.1, but not in Rspec 1.3.2

Doug


On Apr 23, 2011, at 3:00 PM, David Chelimsky wrote:

> On Apr 22, 2011, at 4:58 PM, Doug McInnes wrote:
> 
>> Hi!
>> 
>> I was just talking to @dchelimsky over Twitter about a weird corner case 
>> we've run into on 1.3.1 (I've also been able to reproduce it in 1.3.2)
>> 
>> So we're using this gem called ClassyStruct that's a higher performing 
>> OpenStruct:
>> https://github.com/amikula/classy_struct
>> 
>> Basically it acts the same as OpenStruct but defines methods on the object's 
>> class instead of the object itself on the fly.
>> When it receives a call that hits method_missing it calls attr_accessor on 
>> the method name then passes the call on to the object.
>> 
>> Our problem comes from having one spec that stubs out a call to the object:
>> foo.stub! :bar => 'test'
>> 
>> and later in another spec file trying to set the same method with a value 
>> then having our code use that value:
>> # spec
>> foo.bar = 'other test'
>> # code
>> puts "#{foo.bar} baz"
>> 
>> So our expectation is that foo.bar will return 'other test'. Instead it hits 
>> the old stub on foo which calls method_missing which is picked up again by 
>> ClassyStruct causing it to fire off attr_accessor again then passing the 
>> method through causing the stub to call method_missing and on and on finally 
>> giving us a "stack level too deep" error.
>> 
>> The crux of the problem is that ClassyStruct is adding a method to the class 
>> after Rspec has added the same method to the instance.
>> 
>> As I said it's a very weird corner case because we're calling attr_accessor 
>> on a class that already has objects floating around. The easiest way to fix 
>> this is to use stub! in both places.
>> 
>> Regardless we were surprised that the proxy sticks around after a test run. 
>> What is the reason for keeping it around?
> 
> There's no intent to keep it around, so there is a bug at play here, but 
> let's see if we can narrow it down.
> 
> Can you post (gist or pastie) an example that I can just run as/is to see the 
> behavior you're seeing?

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to