LoginSignup
4
3

More than 5 years have passed since last update.

メソッド名に「send」が存在するクラスのプライベートメソッドテストではまったこと

Last updated at Posted at 2016-03-18

はまったこと

以下のクラスに対して、

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
4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3