2017-11-21 5 views
0

アクセスできないプロパティ(debugLog)がtrueに設定されていることを検証できるモックテストを作成するにはどうすればよいですか?私はその物件の価値を見つける方法を見つけようとしますか? console.debugが設定されていることを確認しますか?この状況ではスパイは意味をなさないのですか?またはスタブを使用すべきですか?ログを有効にしているのかデバッグログを有効にしていますか?

クラスX

let showDebugLogs = false, 
debugLog = _.noop 

/** 
* Configures Class X instances to output or not output debug logs. 
* @param {Boolean} state The state. 
*/ 
exports.showDebugLogs = function (state) { 
    showDebugLogs = state; 
    debugLog = showDebugLogs ? console.debug || console.log : _.noop; 
}; 

ユニットテスト

describe('showDebugLogs(state)', function() { 
     let spy; 
     it('should configure RealtimeEvents instances to output or not output debug logs', function() { 
      spy = sinon.spy(X, 'debugLog'); 
      X.showDebugLogs(true); 
      assert.strictEqual(spy.calledOnce, true, 'Debug logging was not enabled as expected.'); 
      spy.restore(); 
     }); 
    }); 

答えて

1

模擬テストは、その副作用を減少させ、そのテスト能力を高めるために、その環境からテスト対象のクラスを「isoloting」のために使用されています。その上

1) wait for AJAX calls to complete (waste of time) 
2) observe your tests fall apart because of possible networking problems 
3) cause data modifications on the server side 

と:あなたはAJAXは、Webサーバーに呼び出しを行うクラスをテストしている場合たとえば、あなたはおそらくしたくないと思います。

何を行うことは、あなたがどちらかに「MOCK」AJAX呼び出しを行い、あなたのコードの一部であり、あなたのテストに応じて、それで:

1) return success and response accompanying a successful request 
2) return an error and report the nature of the point of failure to see how your code is handing it. 

あなたのケースのために、何が必要だけです単純な単体テストケース。イントロスペクション手法を使用して、オブジェクトの内部状態をアサートすることができます。しかし、これには警告が付いてくる:それは避けてくださいは、オブジェクトの振る舞いや公共の状態をテストするために行われる必要があります下

ユニットテストでノートを参照してください。だから、クラスの内部を気にする必要はありません。

したがって、テストしようとしていることを再検討し、より良いテスト方法を見つけることをお勧めします。

提案:クラス内のフラグをチェックする代わりに、テスト用のロガーをモックアップすることができます。次のように少なくとも2つのテストケースを書く:

1) When showDebugLogs = true, make sure log statement of your mock logger is fired 
2) When showDebuLogs = false, log statement of your mock logger is not called. 

ノート:人の2校間の長い議論がありました:グループは、プライベートメンバー/メソッドは実装の詳細であり、はすべきでないという主張を直接テスト、およびこの考えに反対する別のグループ:

Excerpt from a wikipedia article

TDDの実践の中でいくつかの議論があり、文書化Iとにかく私的な の方法とデータをテストするのが賢明かどうかについては、彼らの ブログやその他の文章を参考にしてください。一部の人々は、私的なメンバーは単に 実装の詳細が変わっている可能性があると主張し、 のテスト番号を付けずに許可する必要があります。したがって、 は、パブリックインターフェイスまたはそのサブクラス インターフェイスを介してクラスをテストするだけで十分です。一部の言語では「保護された」インターフェイスと呼ばれます。[29] その他の機能の重要な側面は、 プライベートメソッドで実装し、それらをテストすることは、直接 より小さく、より直接的なユニットテスト

の利点を提供することができることを言います
関連する問題