使用Jasmine和Knockout模拟计算字段

时间:2013-03-27 17:04:01

标签: knockout.js jasmine stubbing

我正在尝试为依赖于其他两个复杂计算的ko.computed字段编写测试(此处为了演示而删除)。

function PositionsViewModel(options) {
  var self = this;
  self.computed1 = ko.computed(function() { return 1; });
  self.computed2 = ko.computed(function() { return 2; });
  self.computedIWantToTest = ko.computed(function() { 
    return self.computed1() + self.computed2();
  });
}

在我的jasmine测试中,我在beforeEach中创建了一个VM实例,如下所示:

this.subject = new PositionsViewModel();

我希望能够存根computed1computed2,以便我可以单独测试computedIWantToTest。到目前为止,我这样做的尝试都失败了。

我已经尝试直接在vm实例上进行存根。但是,似乎即使方法被覆盖,计算机也会以某种方式缓存该函数。

1 个答案:

答案 0 :(得分:0)

一种方法是注入前两个计算函数。

http://jsfiddle.net/kevincollins/RwKAD/

var PositionsViewModel = function (computedService1, computedService2, options) {

  this.defaultComputed1 = ko.computed(function() { return 1; });
  this.defaultComputed2 = ko.computed(function() { return 2; });

  this.computed1 = computedService1 || this.defaultComputed1;
  this.computed2 = computedService2 || this.defaultComputed2;

  var self = this;
  this.computedIWantToTest = ko.computed(function() { 
    return self.computed1() + self.computed2();
  });

};

var vm1 = new PositionsViewModel();
ko.applyBindings(vm1, document.getElementById("o1"));

var ComputedServiceMock1 = ko.computed(function() { return 100; });
var ComputedServiceMock2 = ko.computed(function() { return 200; });       

var vm2 = new PositionsViewModel(ComputedServiceMock1, ComputedServiceMock2);
ko.applyBindings(vm2, document.getElementById("o2"));