我应该如何使用Jasmine在JavaScript中对单例进行单元测试?

时间:2013-03-13 10:41:45

标签: javascript unit-testing debugging singleton jasmine

我有一些看起来像这样的代码:

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(){}周围有括号,所以这个单例被实例化immediately after it has been parsed.在其余部分中没有调用这个单例的init方法代码加强了我的假设(无论如何,这种情况下init方法的意义是什么?)。

由此得出结论我知道

var myX;

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

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

ReferenceError: x is not defined

那么我该如何解决这个问题呢?

提前致谢!

- 克里斯

1 个答案:

答案 0 :(得分: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')

<强>参考