我在这里有一些交互的东西,它们交互得不好。
我有一个基类:
var ObjOne = (function() {
return function() {
var self = this;
self.propertyOne = ko.observable(1);
self.observable = ko.observable(1);
self.observable.subscribe(function(newValue) {
self.propertyOne(newValue);
});
};
} ());
它有两个 Knockout observables,并在其中一个上定义了一个更新另一个的订阅。
我有一个“子类”,用 jQuery.extend 扩展:
var ObjTwo = (function() {
return function() {
this.base = new ObjOne();
$.extend(this, this.base);
};
} ());
我有一个 Jasmine 测试,它试图问一个问题“当我更新 observable 时,是否调用了 propertyOne?”
it('Test fails to call the correct propertyOne', function() {
var obj = new ObjTwo();
spyOn(obj, 'propertyOne').andCallThrough();
obj.observable(2);
expect(obj.propertyOne).toHaveBeenCalled();
expect(obj.propertyOne()).toBe(2);
});
这失败了“预期的间谍 propertyOne 已被调用。”。当我调试时,observable 会正确更新。在实际系统中,它工作正常(同样,甚至测试“propertyOne 是否等于 2?”通过。当我调试订阅函数时,self.propertyOne 不是间谍,但在测试中,它是。
我有一个解决方案,但不是很好:
it('Test calls the base propertyOne', function() {
var obj = new ObjTwo();
spyOn(obj.base, 'propertyOne').andCallThrough();
obj.observable(2);
expect(obj.base.propertyOne).toHaveBeenCalled();
expect(obj.propertyOne()).toBe(2);
});
请注意添加到这两行的.base 。我不喜欢我必须公开基类,或者必须触摸它的属性才能使测试运行。
这是一个 jsfiddle:http: //jsfiddle.net/4DrrW/23/。问题是 - 有没有更好的方法来做到这一点?