methodのコードは、device_names
おそらく他の Ruby クラスのいくつかのメソッドを呼び出し、それらの呼び出しの結果はコードによって操作されます。これらの呼び出しをスタブ化し、メソッドを分離してテストできます。
String クラスの任意のインスタンスでスタブを作成する方法の (ばかげた) 例を次に示します。
String.any_instance.stub(:downcase).and_return("TEST")
これで、String の任意のインスタンスを呼び出すとdowncase
、"TEST" が返されます。あなたはそれで遊ぶことができますirb
:
irb(main):001:0> require 'rspec/mocks'
=> true
irb(main):002:0> RSpec::Mocks::setup(self)
=> #<RSpec::Mocks::Space:0x10a7be8>
irb(main):003:0> String.any_instance.stub(:downcase).and_return("TEST")
=> #<RSpec::Mocks::AnyInstance::StubChain:0x10a0b68 @invocation_order={:stub=>[nil], :with=>[:stub], :and_return=>[:wit
, :stub], :and_raise=>[:with, :stub], :and_yield=>[:with, :stub]}, @messages=[[[:stub, :downcase], nil], [[:and_return,
"TEST"], nil]]>
irb(main):004:0> "HAHA".downcase
=> "TEST"
もちろん、特定のパラメーターなどに対して、単一のインスタンスでメソッドをスタブ化することもできます。スタブ メソッドの詳細を参照してください。
プラットフォーム固有のコードによって何が返されるかがわかったので、メソッドをテストして、常に期待される結果を得ることができます。