私はいくつかの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();
                });
            });
        });
    }
);