ここで相互作用しているものがいくつかありますが、それらはうまく相互作用していません。
私は基本クラスを持っています:
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);
});
};
} ());
2つのKnockoutオブザーバブルがあり、一方にサブスクライブを定義して、もう一方を更新します。
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);
});
2行に.baseが追加されていることに注意してください。テストを実行するために、基本クラスを公開したり、そのプロパティに触れたりする必要があったのは好きではありません。
これがjsfiddleです:http://jsfiddle.net/4DrrW/23/。問題は-これを行うためのより良い方法はありますか?