我的require.js模块中有outerViewinnerView。可以用以下几句话来描述它们:


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/

10-16 23:04