0

我正在尝试为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();
  });
}

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

this.subject = new PositionsViewModel();

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

我试过直接在 vm 实例上存根。但是,似乎即使方法被覆盖,计算的缓存也会以某种方式缓存函数。

4

1 回答 1

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"));
于 2013-03-28T02:10:49.127 回答