1

ここで相互作用しているものがいくつかありますが、それらはうまく相互作用していません。

私は基本クラスを持っています:

    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/。問題は-これを行うためのより良い方法はありますか?

4

1 に答える 1

2

オブジェクトを呼び出すと$.extend(this, this.base);、基本的に次のようになります。

{
    base: {
        propertyOne: ko.observable(1),
        observable: ko.observable(1)
    },
    propertyOne: base.propertyOne,
    observable: base.observable
}

spyOnforを実行するpropertyOneと、ラッパーに置き換えられます。ただし、サブスクリプションは実際のオブザーバブル間で設定され、ラッパーを呼び出す方法はありません。

にアクセスしたくない場合はbase、オブザーバブルが呼び出されたというテストを削除します。値が正しいことを確認するだけで十分です。

それ以外の場合は、コンストラクターを新しいオブジェクトのようなObjOneもので呼び出して、混合する方がよいでしょう。this

var ObjTwo = (function() {
    return function() {
        ObjOne.call(this);
    };
} ());

次に、テストは問題ありません: http://jsfiddle.net/rniemeyer/z2GU3/

于 2012-11-23T03:57:11.697 に答える