0

簡単なアルゴリズムを持つ Rails アプリケーションとライブラリには、rspec と minitest の両方を使用しました。つまり、私が持っている場合

def add(a, b)
  a + b
end

これは簡単にテストできます。add(2, 2)私はそれが等しいと期待してい4ます。

しかし、特定のマシンに依存するメソッドがあるとします。

def device_names
  # some code to return an array of device names
end

たとえば、が得られます['CPU', 'GPU', 'DSP']が、これは私のマシンに完全に依存しています。私がそれを期待していたなら、他の誰もテストに合格することはできません.

2 番目の例のように、クロス環境テストをどのように処理しますか? テスト用にそのコードをカバーするのに十分なほど汎用的にするにはどうすればよいでしょうか?

4

1 に答える 1

1

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"

もちろん、特定のパラメーターなどに対して、単一のインスタンスでメソッドをスタブ化することもできます。スタブ メソッドの詳細を参照してください。

プラットフォーム固有のコードによって何が返されるかがわかったので、メソッドをテストして、常に期待される結果を得ることができます。

于 2012-12-05T09:32:53.127 に答える