16

私はいくつかのjavascriptテストを書き始めており、モジュールコンストラクターのプライベートメンバーを検査するための最良のアプローチが何であるかを理解しようとしています。たとえば、以下のサンプルでは、​​公開モジュールパターンを使用してパブリックAPIをモジュールに公開しています。ajaxリクエストprivateVarのコールバック中に正しく設定されていることをテストしたいと思います。$.getJSON

モジュールのパブリックAPIに(意図的に)含まれてit('should update privateVar', ...),いないため、2番目のテストは機能しません。myModule.privateVar

だから、私の質問は、privateVarをパブリックAPIの一部にすることなく、この種の動作をテストするための最良の方法は何ですか?テストのためにこのコードを因数分解するより良い方法、またはSinonJのようなものを使用してプライベートメンバーをスパイする方法はありますか?

define('myModule',
    ['jquery'],
    function ($) {
        var
            myVar = "something",
            privateVar = "something else",

            doSomething = function() {
                return $.getJSON('http://myapi.com/do-something', { requestData : "some data" }, function(response){
                    myVar = response.data.value1;
                    privateVar = response.data.value2;
                });
            };

        return {
            doSomething : doSomething,
            myVar : myVar
        };
    }
);

define('test/test.myModule',
    ['myModule', 'chai', 'sinon', 'mocha'],
    function (myModule, chai, sinon) {

        describe("myModule", function() {
            var expect = chai.expect;

            describe('doSomething', function() {

                var value1 = 'value1 value',
                    value2 = 'value2 value';

                beforeEach(function() {
                    sinon.stub($, 'ajax').yieldsTo('success', {
                        data : { value1 : value1, value2 : value2 }
                    });
                });

                afterEach(function() {
                    $.ajax.restore();
                });

                it('should update myVar', function(done) {
                    myModule.doSomething();
                    expect(myModule.myVar).to.equal(value1);
                    done();
                });

                it('should update privateVar', function(done) {
                    myModule.doSomething();
                    expect(myModule.privateVar).to.equal(value2);
                    done();
                });
            });


        });

    }
);
4

4 に答える 4

6

残念ながら、ここで話していることには統合テストが必要です。変数が外部操作の結果として設定されていることをテストしたい場合は、外部メソッドがテストでスタブアウトすることでテストで機能することを信頼する必要があります。これは外部呼び出しを処理します。

あなたができる必要があるのは、テストの条件を制御し(非認証および認証としましょう)、そのインスタンスで関数の結果が何であるかをテストすることです。原則として、私は通常、プライベート メンバーをまったくテストしませんが、既知の良い値と悪い値から生じる望ましい動作をテストします。

少し前に、プライベート変数について説明しているthisも読みました。

于 2013-03-01T09:22:37.063 に答える
3

この方法でプライベート変数にアクセスできる唯一の方法は、後でテストで呼び出して状態を確認できるパブリック ゲッターを追加することです。

あなたのクラスで:

getPrivateVar : function(){ return privateVar; }

次に、return ステートメントに追加します。

return { getPrivateVar : getPrivateVar, };

于 2013-02-27T23:39:50.643 に答える
0

実際、なぜプライベート変数をテストするのでしょうか? できない/難しい. そして、その変数の目的は何ですか? 関数に引数として渡される場合は、もちろん、プライベート変数に割り当てられた特定の値で関数が呼び出されるかどうかをスパイして、関数をテストできます。

于 2016-04-20T10:28:53.210 に答える