使用茉莉来窥探一个没有对象的函数

我是茉莉花新手,刚刚开始使用它。 我有一个图书馆的js文件与许多function,这是没有任何对象(即全球)的关联。 我如何去探究这些function?

我尝试使用窗口/文档作为对象,但即使函数被调用间谍也不工作。 我也尝试把它包装在一个假物体中,如下所示:

var fakeElement = {}; fakeElement.fakeMethod = myFunctionName; spyOn(fakeElement, "fakeMethod"); 

和testing

 expect(fakeElement.fakeMethod).toHaveBeenCalled(); 

这不工作,因为间谍没有工作

如果你正在定义你的function:

 function test() {}; 

那么,这相当于:

 window.test = function() {} /* (in the browser) */ 

所以spyOn(window, 'test')应该工作。

如果不是的话,你也应该能够:

 test = jasmine.createSpy(); 

如果这些都没有工作,其他事情正在进行与您的设置。

我不认为你的fakeElement技术因为幕后操作而起作用。 原始的globalMethod仍指向相同的代码。 从事间谍活动的是代理它,但仅限于一个对象。 如果你能得到你的testing代码,通过伪造元素来调用它,那么你就可以放弃全球fns。

我有两种select(茉莉花2)

这个不太明确,因为看起来function实际上是假的。

 test = createSpy().and.callFake(test); 

第二个更详细,更明确,更“清洁”:

 test = createSpy('testSpy', test).and.callThrough(); 

– > 茉莉花的源代码看第二个参数

TypeScript用户:

我知道OP询问了关于javascript的问题,但是对于想要窥探导入函数的任何TypeScript用户,以下是您可以执行的操作。

在testing文件中,将函数的导入转换为:

 import {foo} from '../foo_functions'; x = foo(y); 

对此:

 import * as FooFunctions from '../foo_functions'; x = FooFunctions.foo(y); 

然后你可以窥探FooFunctions.foo 🙂

 spyOn(FooFunctions, 'foo').and.callFake(...); // ... expect(FooFunctions.foo).toHaveBeenCalled(); 

它必须是可能的,而没有定义窗口。 全局function。 尝试:

  var x = function() {} spyX = spyOn(x, 'call') // // something, that calls x expect(spyX).toBeCalled()