Я начинаю писать некоторые тесты javascript и пытаюсь выяснить, какой лучший подход для проверки частных членов конструктора модуля. Например, в примере ниже я использую шаблон раскрывающего модуля, чтобы открыть публичный api для моего модуля. Я хочу проверить, что privateVar
правильно установлен во время обратного вызова запроса $.getJSON
ajax.
Второй тест it('should update privateVar', ...),
не работает, потому что myModule.privateVar
(намеренно) не находится в общедоступном api для модуля.
Итак, мой вопрос: Каков наилучший способ протестировать такое поведение, не делая частную часть publicvar публичного api? Есть ли лучший способ повлиять на этот код для тестирования?, или, может быть, способ использовать что-то вроде SinonJs, чтобы шпионить за частным членом?
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();
});
});
});
}
);