From a47cf48d543c75e48c9a62d97acdbe9337e1aa1d Mon Sep 17 00:00:00 2001 From: Jon Rowe Date: Wed, 28 Apr 2021 13:04:13 +0100 Subject: [PATCH] [core] Merge pull request rspec/rspec-core#2886 from Liberatys/extend-reserved-memoized-helper-names Extend reserved name check --- This commit was imported from https://github.com/rspec/rspec-core/commit/6f8ee750a4d2b24c6d4d07cbd88632542c74b06b. --- rspec-core/Changelog.md | 1 + rspec-core/lib/rspec/core/memoized_helpers.rb | 10 +++++--- .../spec/rspec/core/memoized_helpers_spec.rb | 24 ++++++++++++++++--- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/rspec-core/Changelog.md b/rspec-core/Changelog.md index c9fcf103b..078053325 100644 --- a/rspec-core/Changelog.md +++ b/rspec-core/Changelog.md @@ -38,6 +38,7 @@ Enhancements: * Improve pluralisation of words ending with `s` (like process). (Joshua Pinter, #2779) * Add ordering by file modification time (most recent first). (Matheus Richard, #2778) +* Extend reserved memoized helper name checking for #let and #subject. (Nick Flückiger, #2886) Bug fixes: diff --git a/rspec-core/lib/rspec/core/memoized_helpers.rb b/rspec-core/lib/rspec/core/memoized_helpers.rb index 6c2389457..efa62b6e3 100644 --- a/rspec-core/lib/rspec/core/memoized_helpers.rb +++ b/rspec-core/lib/rspec/core/memoized_helpers.rb @@ -236,9 +236,13 @@ def let(name, &block) # We have to pass the block directly to `define_method` to # allow it to use method constructs like `super` and `return`. raise "#let or #subject called without a block" if block.nil? - raise( - "#let or #subject called with a reserved name #initialize" - ) if :initialize == name + + # A list of reserved words that can't be used as a name for a memoized helper + # Matches for both symbols and passed strings + if [:initialize, :to_s].include?(name.to_sym) + raise ArgumentError, "#let or #subject called with reserved name `#{name}`" + end + our_module = MemoizedHelpers.module_for(self) # If we have a module clash in our helper module diff --git a/rspec-core/spec/rspec/core/memoized_helpers_spec.rb b/rspec-core/spec/rspec/core/memoized_helpers_spec.rb index 30868e777..c58c5a1f8 100644 --- a/rspec-core/spec/rspec/core/memoized_helpers_spec.rb +++ b/rspec-core/spec/rspec/core/memoized_helpers_spec.rb @@ -520,10 +520,28 @@ def count end.to raise_error(/#let or #subject called without a block/) end - it 'raises an error when attempting to define a reserved method name' do + it 'raises an error when attempting to define a reserved name #initialize' do expect do - RSpec.describe { let(:initialize) { true }} - end.to raise_error(/#let or #subject called with a reserved name #initialize/) + RSpec.describe { let(:initialize) { true } } + end.to raise_error(/#let or #subject called with reserved name `initialize`/) + end + + it 'raises an error when attempting to define a reserved name #initialize as a string' do + expect do + RSpec.describe { let('initialize') { true } } + end.to raise_error(/#let or #subject called with reserved name `initialize`/) + end + + it 'raises an error when attempting to define a reserved name #to_s' do + expect do + RSpec.describe { let(:to_s) { true } } + end.to raise_error(/#let or #subject called with reserved name `to_s`/) + end + + it 'raises an error when attempting to define a reserved name #to_s as a string' do + expect do + RSpec.describe { let('to_s') { true } } + end.to raise_error(/#let or #subject called with reserved name `to_s`/) end let(:a_value) { "a string" }