Hi, I think this issue is simular to this https://github.com/rspec/rspec-core/issues/1163
When using subject(:initialize)
, rspec-core raises an error ArgumentError: wrong number of arguments (1 for 0)
I used this spec to simulate it:
require 'rspec'
class LalaPopo
attr_reader :lala
def initialize
@lala = 1
end
end
describe LalaPopo do
describe '.initialize_it' do
subject(:initialize) { described_class.new }
it 'does something' do
instance = initialize
expect(instance.lala).to eq 1
end
end
end
and run:
$ rspec test_rspec.rb
the error I received:
Failures:
1) LalaPopo.initialize_it does something
Got 0 failures and 2 other errors:
1.1) Failure/Error: define_method(name) { __memoized.fetch_or_store(name) { super(&nil) } }
ArgumentError:
wrong number of arguments (1 for 0)
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/memoized_helpers.rb:295:in `block in let'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:588:in `new'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:588:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `block in run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `map'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `block (3 levels) in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `map'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `block (2 levels) in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/configuration.rb:1875:in `with_suite_hooks'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:113:in `block in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/reporter.rb:78:in `report'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:112:in `run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:87:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:71:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:45:in `invoke'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/exe/rspec:4:in `<top (required)>'
# /home/fabio/.rbenv/versions/2.1.5/bin/rspec:23:in `load'
# /home/fabio/.rbenv/versions/2.1.5/bin/rspec:23:in `<main>'
#
# Showing full backtrace because every line was filtered out.
# See docs for RSpec::Configuration#backtrace_exclusion_patterns and
# RSpec::Configuration#backtrace_inclusion_patterns for more information.
1.2) Failure/Error: define_method(name) { __memoized.fetch_or_store(name) { super(&nil) } }
ArgumentError:
wrong number of arguments (1 for 0)
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/memoized_helpers.rb:295:in `block in let'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:600:in `new'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:600:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `block in run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `map'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `block (3 levels) in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `map'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `block (2 levels) in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/configuration.rb:1875:in `with_suite_hooks'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:113:in `block in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/reporter.rb:78:in `report'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:112:in `run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:87:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:71:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:45:in `invoke'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/exe/rspec:4:in `<top (required)>'
# /home/fabio/.rbenv/versions/2.1.5/bin/rspec:23:in `load'
# /home/fabio/.rbenv/versions/2.1.5/bin/rspec:23:in `<main>'
#
# Showing full backtrace because every line was filtered out.
# See docs for RSpec::Configuration#backtrace_exclusion_patterns and
# RSpec::Configuration#backtrace_inclusion_patterns for more information.
2) LalaPopo.initialize_it does something
Got 0 failures and 2 other errors:
2.1) Failure/Error: define_method(name) { __memoized.fetch_or_store(name) { super(&nil) } }
ArgumentError:
wrong number of arguments (1 for 0)
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/memoized_helpers.rb:295:in `block in let'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:588:in `new'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:588:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `block in run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `map'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `block (3 levels) in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `map'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `block (2 levels) in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/configuration.rb:1875:in `with_suite_hooks'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:113:in `block in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/reporter.rb:78:in `report'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:112:in `run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:87:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:71:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:45:in `invoke'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/exe/rspec:4:in `<top (required)>'
# /home/fabio/.rbenv/versions/2.1.5/bin/rspec:23:in `load'
# /home/fabio/.rbenv/versions/2.1.5/bin/rspec:23:in `<main>'
#
# Showing full backtrace because every line was filtered out.
# See docs for RSpec::Configuration#backtrace_exclusion_patterns and
# RSpec::Configuration#backtrace_inclusion_patterns for more information.
2.2) Failure/Error: define_method(name) { __memoized.fetch_or_store(name) { super(&nil) } }
ArgumentError:
wrong number of arguments (1 for 0)
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/memoized_helpers.rb:295:in `block in let'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:600:in `new'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:600:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `block in run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `map'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/example_group.rb:590:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `block (3 levels) in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `map'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:118:in `block (2 levels) in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/configuration.rb:1875:in `with_suite_hooks'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:113:in `block in run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/reporter.rb:78:in `report'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:112:in `run_specs'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:87:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:71:in `run'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/lib/rspec/core/runner.rb:45:in `invoke'
# /home/fabio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.6.0.beta2/exe/rspec:4:in `<top (required)>'
# /home/fabio/.rbenv/versions/2.1.5/bin/rspec:23:in `load'
# /home/fabio/.rbenv/versions/2.1.5/bin/rspec:23:in `<main>'
#
# Showing full backtrace because every line was filtered out.
# See docs for RSpec::Configuration#backtrace_exclusion_patterns and
# RSpec::Configuration#backtrace_inclusion_patterns for more information.
Finished in 0.0011 seconds (files took 0.11722 seconds to load)
2 examples, 2 failures
Failed examples:
rspec ./test_rspec.rb:15 # LalaPopo.initialize_it does something
rspec ./test_rspec.rb:15 # LalaPopo.initialize_it does something
I know it is weird to create a subject(:initialize)
, but I found this problem in a legacy system, when I tried to upgrade rspec from 3.0.0 to 3.5.0!
The issue is happening due to the fact that RSpec example groups are classes, and it has to create instances of them--during which Ruby calls the initialize
method--in order to run them. In RSpec 3.0.0, RSpec did not define def initialize
, and so ExampleGroup.new
did not take any arguments, and it did not result in an error. However, your example still did not work properly on RSpec 3.0.0--it's just that it didn't fail loudly. Because your let
defines a method, on RSpec 3.0, ExampleGroup.new
caused your initialize
to get run, meaning it got run eagerly when let
is documented as being lazy.
All that's to say: given the special status of initialize
in Ruby, I don't think we can support let(:initialize)
. If you rename it to something else, it'll work.
Do you think RSpec should detect this before attempting to redefine #initialize
?
Do you think RSpec should detect this before attempting to redefine #initialize?
You mean when a user does let(:initialize)
, should RSpec warn the user about it? That wouldn't be a bad idea.
Most helpful comment
You mean when a user does
let(:initialize)
, should RSpec warn the user about it? That wouldn't be a bad idea.