Использование Jasmine для слежки за функцией без объекта
Я новичок в Жасмин и только начал использовать его. У меня есть библиотека js-файл с большим количеством функций, которые не связаны с каким-либо объектом (т. е. являются глобальными). Как я могу шпионить за этими функциями?
Я попытался использовать окно / документ в качестве объекта, но шпион не работал, даже если функция была вызвана. Я также попытался обернуть его в поддельный объект следующим образом:
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.
есть 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(); })
это сработало для меня.