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(){}被实例化。在其余代码中缺少对这个单例方法的调用加强了我的假设(无论如何,在这种情况下该方法的意义是什么?)。initinit

由此得出结论,我知道

var myX;

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

不可能是对的。我已经尝试了许多其他排列来获得一些可以使用的东西(从把它全部排除在外,因为我认为在浏览器达到测试规范时已经解析了包含代码的文件,所以单例类应该可用,对吧?)。但是一切都会导致完全相同的错误消息:

ReferenceError: x is not defined

那么我该如何解决呢?

提前致谢!

- 克里斯

4

1 回答 1

0

如果你得到 x 没有定义,你似乎没有包含模块代码。请向我们展示您如何将其嵌入到您的测试中。

使用两种类型断言,一种在实例化之前,一种在实例化之后,来测试一个单例:

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 回答