我的require.js模块中有outerView
和innerView
。可以用以下几句话来描述它们:InnerView
s在OuterView
呈现时实例化InnerView
自行实例化调用calculated
方法InnerView.calculate
方法使用AJAX,这在单元测试(使用茉莉花)中是不可取的
我需要:在我的茉莉花测试中,用硬编码的innerView.calculate
参数将innerView.handleResults
方法调用替换为直接调用data
。
问题:问题还在于在测试中我只能访问outerView
。因此,我需要在实例化innerView.calculate
之前替换innerView
方法定义。
问题:如何在实例化innerView.calculated
之前替换innerView
方法定义?
码:
define(".....", function(...) {
var innerView = Backbone.View.extend ({
initialize: function() {
......
calculate(opitons);
},
//I NEED TO REPLACE THIS WITH handleResults(hardcodedData)
calculate: function(options) {
var $this = this;
Utils.doSmth(options).then(
$this.handleResults
);
},
handleResults: function(data) {
....
}
});
var outerView = Backbone.View.extend ({
subViews: [],
render: function() {
subViews[0] = new innerView();
}
});
return outerView;
}
最佳答案
请记住,BDD的理念是测试行为。问问自己,您是否真的要更改功能在单元测试中的工作方式?通过提供备用代码路径,您无需测试生产中会看到的实际行为。
例如,如果您在then
函数中进行的数据处理要比仅调用handleResults(...)
更为复杂的数据?然后,您需要将有关此逻辑的知识带入单元测试,以便您可以正确地模拟出链的其余部分。
在我看来,您真正需要的是模拟AJAX请求的方法,而不是更改代码工作方式的方法。有几种方法可以完成此操作。最受欢迎的两个是:
jasmine-ajax-茉莉花特有的
Sinon.JS-用于创建间谍,模拟和模拟HTTP服务器的独立框架。
我已经大量使用Sinon.JS来测试与XHR相关的代码路径,从而产生很大的效果。
关于javascript - JS:在对象实例化之前替换函数定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24893068/