Использование Жасмин, чтобы шпионить за функцией без объекта - PullRequest
134 голосов
/ 01 марта 2012

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

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

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

и тест с

expect(fakeElement.fakeMethod).toHaveBeenCalled();

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

Ответы [ 5 ]

146 голосов
/ 01 марта 2012

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

function test() {};

Тогда это эквивалентно:

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

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

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

test = jasmine.createSpy();

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

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

50 голосов
/ 21 апреля 2017

Пользователи 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();
39 голосов
/ 28 апреля 2015

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

Этот вариант не совсем явный, потому что кажется, что эта функция на самом деле фальшивая.подробный, более явный и «чище»:

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

-> исходный код жасмина для просмотра второго аргумента

8 голосов
/ 27 декабря 2017

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

import * as myFunctionContainer from 'whatever-lib';

const fooSpy = spyOn(myFunctionContainer, 'myFunc');
1 голос
/ 18 июня 2018
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();
            })

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...