Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Jasmine监视没有对象的函数_Javascript_Unit Testing_Jasmine - Fatal编程技术网

Javascript 使用Jasmine监视没有对象的函数

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

我刚接触茉莉花,刚刚开始使用它。我有一个库js文件,其中有许多函数与任何对象都没有关联(即全局函数)。我如何监视这些功能

我尝试使用window/document作为对象,但即使调用了函数,spy也无法工作。我还尝试将其包装在一个伪对象中,如下所示:

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();
});