はまったこと
以下のクラスに対して、
test.rb
class Test
def send
'public method'
end
private
def _private_method(param)
"param is '#{param}'"
end
end
プライベートメソッド「_private_method」のテストコードを書き、
test_spec.rb
require_relative 'test'
describe Test do
let(:instance) { described_class.new }
describe '#_private_method' do
subject { instance.send(:_private_method, param) }
let(:param) { 'aaa' }
it 'プライベートメソッドが呼ばれること' do
expect(subject).to eq "param is 'aaa'"
end
end
end
テストを実行。
すると、、、テストNGとなる。
$ bundle exec rspec test_spec.rb
F
Failures:
1) Test#_private_method プライベートメソッドが呼ばれること
Failure/Error: subject { instance.send(:_private_method, param) }
ArgumentError:
wrong number of arguments (2 for 0)
# ./test.rb:3:in `send'
# ./test_spec.rb:7:in `block (3 levels) in <top (required)>'
# ./test_spec.rb:11:in `block (3 levels) in <top (required)>'
Finished in 0.00066 seconds (files took 0.0703 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./test_spec.rb:10 # Test#_private_method プライベートメソッドが呼ばれること
原因
プライベートメソッド「_private_method」をコールしようとしている箇所
test_spec.rb
subject { instance.send(:_private_method, param) }
が、実際にはパブリックメソッド「send」がコールされてしまっている。
その結果「send」には引数が存在しないため、
ArgumentError:
wrong number of arguments (2 for 0)
のエラーが発生してしまっている。
解決方法
×Object#send
↓
○Object#__send__
にすることで正しくコールされた
正しい解決法なのだろうか。。。
参考URL
test_spec.rb
require_relative 'test'
describe Test do
let(:instance) { described_class.new }
describe '#_private_method' do
# subject { instance.send(:_private_method, param) }
subject { instance.__send__(:_private_method, param) }
let(:param) { 'aaa' }
it 'プライベートメソッドが呼ばれること' do
expect(subject).to eq "param is 'aaa'"
end
end
end