我即将构建一个小部件,我想使用Jasmine来测试代码,我要测试的一件事就是调用了changeHtml。这是我计划构建小部件的一个粗略示例。
var widget = function(userOptions){
var options = userOptions
var init = function(){
changeHtml();
};
var changeHtml = function(){
document.getElementById(options.widgetId).innerHTML = 'New and exiting things!';
};
init();
};
var myWidget = new widget({widgetId: 'widget-div'});
现在,因为changeHtml()
是widget
的私有(正确短语?)函数,我无法监视它是否已被调用。
目前我唯一可以想到的是,让一切都成为widget
的公共方法,但这似乎并不是特别好,因为用户不必/想要致电changeHtml()
他们自己。
这会是什么解决方案?或者,我是否以错误的方式思考这个问题,检查div的innerHTML是否实际上已被更改而不是被调用的函数会更好吗?
答案 0 :(得分:2)
1)测试最终结果,或2)在函数/对象中公开的spyOn
函数。
要测试场景中的最终结果,您需要在更改后检查HTML值,或者检查它是否已被调用,以便设置值,如下所示:
describe("widget", function () {
it("Should change html", function () {
// Arrange
spyOn(document, "getElementById").and.callThrough();
// Act
var myWidget = new widget({ widgetId: 'widget-div' });
// Assert
expect(document.getElementById).toHaveBeenCalled();
});
});