0

「ウェイトコンバーター」

スタブを使用するコツをつかもうとしていますが、フォーマットを正しく取得できません。何が間違っていますか?この場合、コードにメソッドがすでに含まれていることはわかっていますが、スタブを正しく実行する方法を学習しようとしています。

テスト:

describe "Convert Pounds to Kilograms" do

it "should convert 3lb to 1kg" do
  weight = WeightConverter.stub!(:convert).with(3, 'lbs_to_kgs').and_return(1)
  weight.should == 1
end

コード:

class WeightConverter

  def self.convert(from, what_to_what)
    if what_to_what == 'lbs_to_kgs'
      (from / 2.2).truncate
    elsif what_to_what == 'kgs_to_lbs'
      (from * 2.2).truncate
    end
  end
end

fyi-これは機能します(スタブなし)

  it "should convert 91lbs to 41kgs" do
    weight = WeightConverter.convert(91, 'lbs_to_kgs')
    weight.should == 41
  end

エラー:

失敗:

 1) Convert Pounds to Kilograms should convert 3lb to 1kg
     Failure/Error: weight.should == 1
       expected: 1
            got: #<Proc:0x000000010b0468@/home/durrantm/.rvm/gems/ruby-1.9.3-p125/gems/rspec-mocks-2.10.1/lib/rspec/mocks/message_expectation.rb:459 (lambda)> (using ==)
     # ./weight_converter_spec.rb:19:in `block (2 levels) in <top (required)>'

Finished in 0.00513 seconds
7 examples, 1 failure

スタブに割り当てるのではなく、次のようなことを行う必要があります。

it "should convert 3lb to 1kg" do
  WeightConverter.stub!(:convert).with(3, 'lbs_to_kgs').and_return(1)
  weight = WeightConverter.convert(3, 'lbs_to_kgs')
  weight.should == 1
end

ただし、これはかなり役に立たないテストです。テストするのは、スタブ/モックライブラリが想定どおりに動作することだけです(つまり、実際にはWeightConverterをまったくテストしていません)。WeightConverterの内部を直接テストしているため、スタブする必要はありません。2番目の例のように実際の値を使用する必要があります。ただし、WeightConverterが別のクラスに依存している場合は、その別のクラスをスタブする可能性があります。

4

1 に答える 1

2

スタブに割り当てたくない場合は、次のようにする必要があります。

it "should convert 3lb to 1kg" do
  WeightConverter.stub!(:convert).with(3, 'lbs_to_kgs').and_return(1)
  weight = WeightConverter.convert(3, 'lbs_to_kgs')
  weight.should == 1
end

ただし、これはかなり役に立たないテストです。テストしているのは、スタブ/モック ライブラリが想定どおりに動作することだけです (つまり、実際には WeightConverter をまったくテストしていません)。WeightConverter の内部を直接テストしているので、スタブする必要はありません。2 番目の例のように、実際の値を使用する必要があります。ただし、WeightConverter が別のクラスに依存している場合は、その別のクラスをスタブ化できます。

于 2012-05-13T23:49:48.010 に答える