0

わかりました、今は怒らないでください。このトピックについていくつか質問があることは知っていますが、まだいくつか疑問があります。

プライベート関数をテストしないことに完全に同意すると思いますが、それは合理的だと思いますが、プライベート変数を設定するパブリックメソッドをテストするにはどうすればよいですか?

コンストラクターがいくつかのプライベート変数を設定し、コンストラクターが呼び出された後にそれらの変数が正しく設定されていることをテストしたいとしましょう。有効なテストですか?パブリックゲッターを追加せずにプライベート変数の値を確認するにはどうすればよいですか?

より明確にするために、実際ではないシナリオの例を追加します。

public class ClassToTest
{
   private bool _isOn;

   public void SwitchOn() { _isOn = true; }
   public void SwitchOff(){ _isOn = false; }

   public void update()
   {
      if (_isOn)
        DoSomething();
   }

   private void DoSomething()
   {
     //this could also execute a function of an external dependency. But still the dependency could not have a public function to test if the behavior actually ran.
   }
}

_isOn 値に対してテストできない場合、SwitchOn と SwitchOff が適切に機能することをテストするにはどうすればよいですか? (これは一例です。パブリック ゲッターを記述せず、関数が値を返す必要がないため値を返さないことを意味します)

4

2 に答える 2

0

テストでは、Assemble/Activate/Assert パターンを使用する必要があります。

test switch on {
  x = new ClassToTest();
  x.SwitchOn();   //  <--  Assemble an on switch
  EmptyMailQueue();   // <-- Assemble nothing in the Q

  PossiblySendUserEmail();  // <-- Activate the feature

  assert(mailQueue.count() == 1);
  }

test switch on {
  x = new ClassToTest();
  x.SwitchOff();
  EmptyMailQueue();

  PossiblySendUserEmail();

  assert(mailQueue.count() == 0); // <-- Assert switch is off so no mails sent
  }

あなたがスイッチを持っている実際の理由を主張します。スイッチ自体をテストすると、「TDD ゲッターとセッターを使用しない」という規則が破られます。

于 2012-06-20T15:41:19.390 に答える
-1

プライベートメンバーにはバグがある可能性があるため、テストする必要があります。

「プライベート」は魔法の障壁ではなく、プロダクションコードクライアントにそのメンバーを直接呼び出さないようにアドバイスする単なる慣習です。

そのようなすべてのメンバーの前に_underbarを付けると、C++がそのようなメソッドをハードウェアで保護するのと同じくらい便利です。

あなたの車のエンジンは、整備士が物事をテストするときだけ、運転中に使用されるべきではないプラグを内部に持っています。ソフトウェアは同じである必要があります。プライベートメンバーをテストし、必要に応じてプライベートを無効にします。

でも...


オブジェクトのポイントは、動作を公開することです。プライベート変数が正しく設定されている場合、オブジェクトは正しく動作するはずです。テストでこの動作を要求する必要があります。

「テスト駆動開発」を検索し(そして昨日それを使い始めます)、「インテンショナルプログラミング」を検索します。テストケースは、その動作を要求することから開始する必要があり、実装の詳細について心配する必要はありません。異なる内部を使用するようにオブジェクトをアップグレードする場合、理由もなく中断するテストをあまり多くする必要はありません。

(エルフやソフトウェアメソドロジストにアドバイスを求めないでください。彼らは「はい」と「いいえ」の両方を言うでしょう!;)

于 2012-06-20T15:13:28.187 に答える