2013-03-27 60 views
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实例上存根。但是,似乎即使这些方法以某种方式覆盖了计算缓存函数。

+0

你是正确的,'computed'不抱到观测(包括computeds)时,第一次运行建立其依赖性跟踪的参考。您需要更改原始计算结果,而无需为其创建新的函数。 – Tyrsius 2013-03-27 18:46:34

回答

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")); 
+1

它有效,但我必须修改我的应用程序代码以适合测试。我认为这绝对不是理想的。 – iterion 2013-03-30 20:15:17

+1

这不是正确的做法。使用依赖注入很快就会变得笨重。我们需要的是一种迫使计算值更新为被窥探(并被替换)的函数的方法。 – genexp 2013-05-29 16:24:34