Использование Jasmine для шпионажа на функцию без объекта
Я новичок в Jasmine и только начал его использовать. У меня есть файл js библиотеки с множеством функций, которые не связаны ни с каким объектом (т.е. Являются глобальными). Как я могу следить за этими функциями?
Я попытался использовать окно/документ в качестве объекта, но шпион не работал, даже несмотря на то, что функция была вызвана. Я также попробовал обернуть его в поддельный объект следующим образом:
var fakeElement = {};
fakeElement.fakeMethod = myFunctionName;
spyOn(fakeElement, "fakeMethod");
и проверьте с помощью
expect(fakeElement.fakeMethod).toHaveBeenCalled();
Это не работает, так как шпион не работал
Ответы
Ответ 1
Если вы определяете свою функцию:
function test() {};
Тогда это эквивалентно:
window.test = function() {} /* (in the browser) */
Итак, spyOn(window, 'test')
должен работать.
Если это не так, вы также сможете:
test = jasmine.createSpy();
Если ни одна из них не работает, что-то происходит с вашей настройкой.
Я не думаю, что ваш метод fakeElement
работает из-за того, что происходит за кулисами. Первоначальный globalMethod все еще указывает на тот же код. То, что шпионят, это прокси-сервер, но только в контексте объекта. Если вы можете получить свой тестовый код для вызова через fakeElement, он будет работать, но тогда вы сможете отказаться от глобальных fns.
Ответ 2
Существует 2 варианта, которые я использую (для жасмина 2)
Это не совсем ясно, потому что кажется, что функция на самом деле является подделкой.
test = createSpy().and.callFake(test);
Второй более подробный, более явный и "чистый":
test = createSpy('testSpy', test).and.callThrough();
- > исходный код жасмина, чтобы увидеть второй аргумент
Ответ 3
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();
Ответ 4
он должен быть возможен без указания окна. глобальной функции. Попробуйте:
var x = function() {}
spyX = spyOn(x, 'call') //
// something, that calls x
expect(spyX).toBeCalled()