1

次のようなコードがあります。

var x = x || (function() {

    // Some private variables
    // ...

    return {
        init:function(options) {
            // Do stuff
            // ...
        },

        // Some other public methods
        // ...
    };
})();

私が正しければ、これはシングルトン クラスです。ここで、Jasmine を使用してこのクラスの単体テストを書きたいと思いました。私は次のようなことから始めました:

describe("x", function() {

    var myX;

    beforeEach(function(){
        myX = x; 
    });

    it("has been instatiated correctly", function() {
        expect(myX.init).toBeDefined();
    });
});

私は、最も外側の を括弧で囲んでいるためfunction(){}、このシングルトンは解析された直後にインスタンス化されることを理解しています。コードの残りの部分でこのシングルトンのメソッドへの呼び出しがないことは、私の仮定を強化します (とにかく、この場合initのメソッドの意味は何ですか?)。init

このことから私が知っている結論

var myX;

beforeEach(function(){
    myX = x; 
});

正しくありません。何かを動作させるために、他の多くの順列を試しました (コードを含むファイルは、ブラウザーがテスト仕様に到達した時点で既に解析されていると考えたため、すべてを除外することから始めて、シングルトン クラスを使用する必要があります)。利用可能ですよね?)。しかし、すべてがまったく同じエラーメッセージになります。

ReferenceError: x is not defined

では、どうすればこれを修正できますか?

前もって感謝します!

– クリス

4

1 に答える 1

0

x が定義されていない場合は、モジュール コードが含まれていないようです。テストにどのように組み込むかを示してください。

インスタンス化前とインスタンス化後の 2 つの型アサーションを使用して、シングルトンをテストします。

function foo()
  {
  foo = {};
  return 1;
  }

console.assert(foo.constructor === Object, "foo.constructor === Function", 'foo should be a type of Function before it is instantiated')

foo();

console.assert(foo.constructor === Object, "foo.constructor === Object", 'foo should be a type of Object after it is instantiated')

参考文献

于 2013-12-05T03:14:17.050 に答える