我开始编写一些JavaScript测试,并试图找出检查模块构造函数的私有成员的最佳方法。例如,在下面的示例中,我使用揭示模块模式将公共API公开给我的模块。我想测试在
第二个测试
因此,我的问题是,有什么最好的方法可以测试这种行为而无需使privateVar成为公共API的一部分?是否有更好的方法来为测试编写代码,或者可能使用类似SinonJs的东西来监视私有成员?
$.getJSON
ajax请求的回调期间是否正确设置了privateVar
。第二个测试
it('should update privateVar', ...)
不起作用,因为myModule.privateVar
(有意)不在模块的公共API中。因此,我的问题是,有什么最好的方法可以测试这种行为而无需使privateVar成为公共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();
});
});
});
}
);