Использование Jasmine для слежки за функцией без объекта


Я новичок в Жасмин и только начал использовать его. У меня есть библиотека js-файл с большим количеством функций, которые не связаны с каким-либо объектом (т. е. являются глобальными). Как я могу шпионить за этими функциями?

Я попытался использовать окно / документ в качестве объекта, но шпион не работал, даже если функция была вызвана. Я также попытался обернуть его в поддельный объект следующим образом:

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

и

expect(fakeElement.fakeMethod).toHaveBeenCalled();

это не работает ни как шпион не работал

6 119

6 ответов:

если вы определяете свою функцию:

function test() {};

тогда, это равносильно:

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

так spyOn(window, 'test') должны работать.

если это не так, вы также должны быть в состоянии:

test = jasmine.createSpy();

если один из них не работает, что-то не так с вашей установки.

Я не думаю, что ваш fakeElement техника работает из-за того, что происходит за кулисами. Исходный globalMethod по-прежнему указывает на тот же код. Чем занимается шпионаж это прокси, но только в контексте объекта. Если вы можете получить свой тестовый код для вызова через fakeElement, он будет работать, но тогда вы сможете отказаться от глобальной fns.

есть 2 альтернативы, которые я использую (для Жасмин 2)

это не совсем ясно, потому что кажется, что функция на самом деле подделка.

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

второй более подробный, более явный и"более чистый":

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

->Жасмин исходный код чтобы увидеть второй аргумент

пользователи TypeScript:

Я знаю, что ОП спросил о 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();

очень простой способ:

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

это сработало для меня.

это должно быть возможно без определения окна. глобальная функция. Попробуйте:

   var x = function() {}

   spyX = spyOn(x, 'call') //

   // something, that calls x
   expect(spyX).toBeCalled()