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

IT技术 javascript unit-testing jasmine
2021-01-15 18:14:21

我是 Jasmine 的新手,刚刚开始使用它。我有一个库 js 文件,其中包含许多与任何对象(即全局)无关的函数。我该如何监视这些功能?

我尝试使用 window/document 作为对象,但即使调用了该函数,间谍也不起作用。我还尝试将它包装在一个假对象中,如下所示:

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

并测试

expect(fakeElement.fakeMethod).toHaveBeenCalled();

这也不起作用,因为间谍不起作用

6个回答

如果您正在定义您的功能:

function test() {};

那么,这相当于:

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

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

如果不是这样,您还应该能够:

test = jasmine.createSpy();

如果这些都不起作用,那么您的设置就会发生其他事情。

我认为你的fakeElement技术行不通是因为幕后发生的事情。原来的 globalMethod 仍然指向相同的代码。间谍所做的是代理它,但仅在对象的上下文中。如果你可以让你的测试代码通过 fakeElement 调用它就会工作,但是你就可以放弃全局 fns。

由于未分配“窗口”,我在使用 spyOn(window, 'test') 使用 chutzpah 运行测试作为我们自动化的一部分时遇到了一些问题。使用 jasmine.createSpy() 解决了这个问题。
2021-03-20 18:14:21
jasmine.createSpy() 非常适合我。谢谢!
2021-03-21 18:14:21
用于test = jasmine.createSpy();监视 angularJs$anchroScroll工作得很好
2021-03-25 18:14:21
出于某种原因,我无法以任何一种方式工作,但完全有可能是因为我正在尝试模拟现有的窗口函数;$window.open(url, '_blank');目的是打开一个新选项卡(或窗口,取决于浏览器设置)。无论浏览器如何,我应该如何确保它正在调用此函数并验证它是否导航到正确的 url?
2021-03-27 18:14:21
有效!我认为我之前犯的错误是我用 method() 而不是 method 调用了 spyOn。谢谢!
2021-04-06 18:14:21

typescript用户:

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

在测试文件中,从这个转换函数的导入:

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();
似乎只有在使用别名 FooFunctions 显式调用函数时才有效我有一个函数 bar(),它是一个返回 baz() 的工厂,想测试 baz() 调用 foo()。这种方法在这种情况下似乎不起作用。
2021-03-16 18:14:21
像魅力一样工作!谢谢,你节省了我很多时间!
2021-03-20 18:14:21
这将工作,如果别名是采取内部foo_functions export const FooFunctions = { bar, foo }; 和测试的进口变成 import { FooFunctions } from '../foo_functions'. 然而,别名仍然需要foo_functions私人执行中被明确地用于间谍工作。 const result = FooFunctions.foo(params)// 间谍报告呼叫const result = foo(params)// 间谍报告没有呼叫
2021-03-21 18:14:21
这不再起作用了 Error: <spyOn> : parseCookie is not declared writable or has no setter
2021-03-29 18:14:21
感谢您的 TypeScript 提示。ES6/Babel 应该也一样,不过我没试过。
2021-04-11 18:14:21

我使用了 2 个替代方案(用于茉莉花 2)

这个不是很明确,因为看起来这个函数实际上是一个假的。

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

第二个更冗长,更明确,“更干净”:

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

-> jasmine 源码看第二个参数

这更有意义,并且将其分解得足够远以成功复制。来自我的 +1。谢谢,C§
2021-03-27 18:14:21

一个非常简单的方法:

import * as myFunctionContainer from 'whatever-lib';

const fooSpy = spyOn(myFunctionContainer, 'myFunc');
import * as saveAsFunctions from 'file-saver';
..........
....... 
let saveAs;
            beforeEach(() => {
                saveAs = jasmine.createSpy('saveAs');
            })
            it('should generate the excel on sample request details page', () => {
                spyOn(saveAsFunctions, 'saveAs').and.callFake(saveAs);
                expect(saveAsFunctions.saveAs).toHaveBeenCalled();
            })

这对我有用。

请为您的答案添加解释,如果他们无法理解正在发生的事情,代码本身对提出问题的人没有多大帮助。
2021-03-26 18:14:21