[rspec-users] Fwd: Issue with AR::Base descendants with certain argument

Bira u.alberton at gmail.com
Mon Nov 1 11:02:32 EDT 2010

On Mon, Nov 1, 2010 at 10:32 AM, David Chelimsky <dchelimsky at gmail.com> wrote:
> Can you post a real example of this complete with spec,
> implementation, and failure message?
> Thx

This is the closest I could get with my limited knowledge of RSpec's
and RSpec-rails's internals. I tried to replicate a bit of
rails-settings' "fancy footwork" with method_missing, and I use a
before(:all) block here to simulate what happens in my app, where a
stub happens within a normal before block in one point and causes a
similar failure 700 lines later.

require 'spec_helper'

describe "stubbing a class method" do

  class Settings < ActiveRecord::Base
    @@defaults = {
      "foo" => "a",
      "bar" => "b"
    def self.method_missing(sym, *args)
    rescue NoMethodError

  before(:all) do

  specify "works when the stub is invoked for the first time" do
    Settings.foo.should == "c"
    Settings.bar.should == "b"

  specify "should not raise an error after the first time" do
    lambda { Settings.foo.should == "a"}.should_not raise_exception


Running this along with RSpec-rails' other specs gives me the following failure:

'stubbing a class method should not raise an error after the first time' FAILED
expected no Exception, got #<NoMethodError: undefined method `foo' for

I'm not sure if the correct behavior would be to call the actual
implementation of Settings.foo, or to give a different error message.
Currently, it tries to call ActiveRecord::Base.foo .

Not using a before(:all) block prevents the failure, but as I said
it's only here as a "shorthand" for the complex specs I have on my
app. Actually declaring a .foo class method on Settings also makes it
pass, so method_missing seems to be part of the problem.

On my app's specs, I found out that calling "unstub!" explicitly on an
after block makes some specs pass as well.


More information about the rspec-users mailing list