2012-09-03 91 views
2

我正在使用jasmine-node对javascript代码进行单元测试。我有一些全球功能,我想间谍,并允许通话,但尽管如此,原来的实施。以下面的代码为例。使用jasmine-node监听全局函数

由于我无法解释的原因,我看到一个错误“globalFunction()方法不存在”。

有人能告诉我为什么茉莉花不能找到这种globalFunction方法,我知道它在全球范围内。

我感谢帮助

var globalFunction = function() { 
    console.log('globalFunction'); 
}; 

describe("A Global Function", function() { 
    jasmine.getEnv().addReporter(new jasmine.ConsoleReporter(console.log)); 
    it("may be spied upon", function() { 
     spyOn(global,'globalFunction').andCallThrough(); 
     globalFunction(); 
     expect(globalFunction).toHaveBeenCalled(); 
    }); 
}); 

这里是茉莉节点的输出

$ jasmine-node --verbose test.spec.js 
Runner Started. 
A Global Function : may be spied upon ... 
Failed. 
A Global Function: 0 of 1 passed. 

A Global Function 
    may be spied upon 

Failures: 

    1) may be spied upon 
    Message: 
    globalFunction() method does not exist 
    Stacktrace: 
    undefined 

Finished in 0.008 seconds 
1 test, 1 assertion, 1 failure 


Runner Finished. 
1 spec, 1 failure in 0.008s.  

回答

3

globalFunction实际上不是全球性的。删除var关键字使其成为全球。

globalFunction = function() { 
    console.log('globalFunction'); 
}; 

在浏览器中,顶层范围全局范围。这意味着在浏览器中,如果你在全局范围内,var的东西将定义一个全局变量。在Node中,这是不同的。顶级范围不是全球范围; var模块内的某些东西对本模块来说是本地的。

+0

嗨,谢谢,这解释了为什么不能引用该函数。如何引用该模块的本地范围? – punkle

+0

就我所知,本地模块范围没有特别的参考。 –

+0

请注意,这不适用于严格模式。 – Randy