4

デバイスのシステム テストに rspec を使用しています。このデバイスはモジュール式であるため、任意の数のサブデバイスをテスト リグに接続できます。接続されたサブデバイスをループして各デバイスで同じテストを実行するテストを記述したい場所がたくさんあります。

基本的に、これは私がやろうとしていることです:

before(:all)   
  @tool = discover_sub_devices()
  @tool.sub_devices.should == exp_sub_device_list
end

describe "some sub device tests" do
  @tool.sub_devices.each do |dev|   
    it "should succeed at doing things" do
      dev.do_thing.should == success   
    end 
  end
end

残念ながら、これは機能しません。@tool が nill でありsub_devices、テストが実行される前にクラスが含まれていないというエラーが表示されます。before(:all)したがって、ブロックが実行される前にテストが解析されます。

機能させる方法の 1 つは、itブロック内にループを配置することです。このような:

it "should succeed at doing things" do
  @tool.sub_devices.each do |dev| 
    dev.do_thing.should == success   
  end
end

この方法の問題は、最初のデバイスが失敗した場合でも、すべてのサブデバイスをテストしたいということです。障害が発生したサブ デバイスの正確な数のレポートを表示したい。このコードは、1 つが失敗するとすぐに抜け出し、残りはテストしません。

これはおそらく rspec の通常の使用例ではないことは承知していますが、これを機能させることができれば、テスト状況にとって非常に便利です。

助言がありますか?

4

2 に答える 2

0

あなたが直面している問題は、ブロックの本体がすぐdescribeに実行されlet、ブロックの本体が後で実行されることです。beforeit

毎回デバイスを再検出する必要がないと仮定すると、次のようにコードをリファクタリングして、before呼び出しをなくすことができます。

describe "some sub device tests" do
  tool = discover_sub_devices()
  it "should discover sub devices correctly" do
     tool.sub_devices.should == exp_sub_device_list
  end
  tool.sub_devices.each do |dev|   
    it "should succeed at doing things" do
      dev.do_thing.should == success   
    end 
  end
end
于 2013-09-16T14:02:19.557 に答える