Подтвердить что ты не робот

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

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

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

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

и проверьте с помощью

expect(fakeElement.fakeMethod).toHaveBeenCalled();

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

4b9b3361

Ответ 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()