Javascript 使用Jasmine监视没有对象的函数
我刚接触茉莉花,刚刚开始使用它。我有一个库js文件,其中有许多函数与任何对象都没有关联(即全局函数)。我如何监视这些功能 我尝试使用window/document作为对象,但即使调用了函数,spy也无法工作。我还尝试将其包装在一个伪对象中,如下所示:Javascript 使用Jasmine监视没有对象的函数,javascript,unit-testing,jasmine,Javascript,Unit Testing,Jasmine,我刚接触茉莉花,刚刚开始使用它。我有一个库js文件,其中有许多函数与任何对象都没有关联(即全局函数)。我如何监视这些功能 我尝试使用window/document作为对象,但即使调用了函数,spy也无法工作。我还尝试将其包装在一个伪对象中,如下所示: var fakeElement = {}; fakeElement.fakeMethod = myFunctionName; spyOn(fakeElement, "fakeMethod"); utils.ts // file for all g
var fakeElement = {};
fakeElement.fakeMethod = myFunctionName;
spyOn(fakeElement, "fakeMethod");
utils.ts // file for all global utilities
function globalUtil() {
// some code
}
abc.component.ts
function foo {
// some code
globalUtil(); // calls global function from util.ts
}
While writing a Jasmine test for function foo () , you can spy on the globalUtil function as follows :
abc.component.spec.ts
import * as SharedUtilities from 'util.ts';
it('foo', () =>
{
const globalUtilSpy = jasmine.createSpy('globalUtilSpy');
spyOnProperty(SharedUtilities, "globalUtilSpy").and.returnValue(globalUtilSpy);
foo();
expect(globalUtilSpy).toHaveBeenCalled();
});
测试
expect(fakeElement.fakeMethod).toHaveBeenCalled();
这也不起作用,因为如果要定义函数,spy不起作用:
function test() {};
那么,这相当于:
window.test = function() {} /* (in the browser) */
所以spyOn(窗口,'test')
应该可以工作
如果不是,您还应该能够:
test = jasmine.createSpy();
如果这些都不起作用,则说明您的设置正在进行其他操作
我认为你的
fakeElement
技术不起作用,因为幕后发生了什么。最初的globalMethod仍然指向相同的代码。间谍所做的是代理它,但仅在对象的上下文中。如果你能让测试代码通过fakeElement调用,它会工作,但是你可以放弃全局fns。我使用了两种选择(对于jasmine 2)
这个函数不是很明确,因为它似乎实际上是一个伪函数
test = createSpy().and.callFake(test);
第二个更详细、更明确、更“干净”:
->要查看第二个参数,请键入脚本用户: 我知道OP询问了javascript,但是对于任何遇到javascript的想要监视导入函数的TypeScript用户,下面是您可以做的 在测试文件中,从以下位置转换函数的导入:
import {foo} from '../foo_functions';
x = foo(y);
为此:
import * as FooFunctions from '../foo_functions';
x = FooFunctions.foo(y);
然后您可以监视foo函数。foo
:)
一个非常简单的方法:
import * as myFunctionContainer from 'whatever-lib';
const fooSpy = spyOn(myFunctionContainer, 'myFunc');
这对我很有用。我的答案与@FlavorScape略有不同,因为我在导入的模块中有一个(默认导出)函数,我做了以下操作:
import * as functionToTest from 'whatever-lib';
const fooSpy = spyOn(functionToTest, 'default');
我们通常采用的方法如下:
var fakeElement = {};
fakeElement.fakeMethod = myFunctionName;
spyOn(fakeElement, "fakeMethod");
utils.ts // file for all global utilities
function globalUtil() {
// some code
}
abc.component.ts
function foo {
// some code
globalUtil(); // calls global function from util.ts
}
While writing a Jasmine test for function foo () , you can spy on the globalUtil function as follows :
abc.component.spec.ts
import * as SharedUtilities from 'util.ts';
it('foo', () =>
{
const globalUtilSpy = jasmine.createSpy('globalUtilSpy');
spyOnProperty(SharedUtilities, "globalUtilSpy").and.returnValue(globalUtilSpy);
foo();
expect(globalUtilSpy).toHaveBeenCalled();
});
成功了!我想我之前犯的错误是我用method()而不是method调用spyOn。谢谢我在使用spyOn(window,'test')时遇到了一些问题,因为没有分配“window”,所以我使用chutzpah来运行测试,作为我们自动化的一部分。使用jasmine.createSpy()解决了这个问题。jasmine.createSpy()对我来说非常有效。谢谢使用
test=jasmine.createSpy()
监视angularJs$Ancroscroll
工作得很好,因为某种原因,我无法使用任何一种方法,但完全有可能是因为我试图模拟现有的窗口函数<代码>$window.open(url“_blank”)代码>用于打开新选项卡(或窗口,具体取决于浏览器设置)。我应该如何确保它调用此函数,并验证它是否导航到正确的url,而不考虑浏览器?这更有意义,并将其分解到足以成功复制的程度+从我这里得到1。谢谢你的打字提示。对于ES6/Babel也应该是一样的,但我还没有尝试过。似乎只有在使用别名FooFunctions显式调用函数时才有效。我有一个函数bar(),它是一个返回baz()的工厂,我想测试baz()调用foo()。此方法在该场景中似乎不起作用。如果在foo_函数export const foo functions={bar,foo}中使用别名,则此方法将起作用代码>和测试中的导入从“../foo_函数”变为import{fooofunctions}。
但是,仍然需要在foo_函数私有实现中显式使用别名,间谍才能工作const result=FooFunctions.foo(params)
//间谍报告调用const result=foo(params)
//间谍报告没有调用像符咒一样有效!谢谢,你帮我节省了很多时间!这已经不起作用了,出现了一个错误::parseCookie未声明为可写或没有setter
请对您的答案进行解释,如果问问题的人无法理解发生了什么,代码本身对他们没有多大帮助。
utils.ts // file for all global utilities
function globalUtil() {
// some code
}
abc.component.ts
function foo {
// some code
globalUtil(); // calls global function from util.ts
}
While writing a Jasmine test for function foo () , you can spy on the globalUtil function as follows :
abc.component.spec.ts
import * as SharedUtilities from 'util.ts';
it('foo', () =>
{
const globalUtilSpy = jasmine.createSpy('globalUtilSpy');
spyOnProperty(SharedUtilities, "globalUtilSpy").and.returnValue(globalUtilSpy);
foo();
expect(globalUtilSpy).toHaveBeenCalled();
});