3

私は SW 開発者として採用され、Ruby で RSPEC と RR を使用した単体テストに取り組もうとしていますが、具体的な戦略を決めるのに苦労しています。これは主に、すでに開発されているコードに単体テストを書くように割り当てられたためです。書かれています。

method1 という大きなメソッドの一部である次のコードを考えてみましょう。

  if (["5234541252", "6236253223"].include?(self.id))
    self.DoCheck
    logs.add 'Doing check', "id = #{self.id}"
    return
  end

メソッドのこの部分に関連する単体テストは次のようになります。

"should do check only if id = 5234541252 or 6236253223"

しかし、基本的にベストプラクティスに関連するいくつかの質問に直面しています。たとえば、次のとおりです。

RR と RSPEC を使用して DoCheck が「method1」内から呼び出されたかどうかを確認するにはどうすればよいですか?

dont_allow(Object).DoCheck を使用してみましたが、うまくいきません。

describe :do_route do
  it "should do check only if id = 5234541252 or 6236253223" do
  user = Factory(:User)
  user.id = "5234541252"

  dont_allow(user).DoCheck
  user.method1
end

「DoCheck」が呼び出されたかどうかを判断する他の方法はありますか?

4

1 に答える 1

0

テスト中のオブジェクトに対して「部分モッキング」手法を使用できます。これは、にメッセージをuser.method1送信する期待値を設定する必要があることを意味します。RSpec はメソッドでこの期待値を設定できます。期待が満たされない場合、テストは失敗します。DoCheckusershould_receive()

次のコードを試してください。

describe :do_route do
  it "should do check if id = 5234541252 or 6236253223" do
    user = Factory(:User)
    user.id = "5234541252"

    user.should_receive(:DoCheck) # set expectation that DoCheck will be called

    user.method1  # execute
  end
end

RRを使用すると、この期待値は次のようになります。

describe :do_route do
  it "should do check if id = 5234541252 or 6236253223" do
    user = Factory(:User)
    user.id = "5234541252"

    mock(user).DoCheck # set expectation that DoCheck will be called

    user.method1  # execute
  end
end

アップデート

ただし、モック オブジェクトと部分モックを使用すると、テスト コードがテスト対象のコードの現在の動作に密接に結合されるため、注意が必要です。将来、このコードをリファクタリングする場合、多くの失敗するテスト (モックを使用するテスト) が発生する可能性があります。モック (入出力) を使用せずにコードをテストしてみて、テスト対象のクラスの意図が明確に説明されている場合にのみモックを使用してください。モックでテストを書くときは、このメソッドが別のメソッドを呼び出すことを本当に主張する必要があるのか​​ 、それとも本当に気にかけているのはメソッドの出力か何か他のものなのかを常に自問してください。

お役に立てれば!

于 2011-12-11T14:54:51.470 に答える