wake-up-neo.com

Mit Jasmine eine Funktion ohne Objekt ausspionieren

Ich bin neu bei Jasmine und habe es gerade erst angefangen. Ich habe eine Library-js-Datei mit vielen Funktionen, die keinem Objekt zugeordnet sind (d. H. Global sind). Wie kann ich diese Funktionen ausspionieren?

Ich habe versucht, window/document als Objekt zu verwenden, aber der Spion funktionierte nicht, obwohl die Funktion aufgerufen wurde. Ich habe auch versucht, es wie folgt in ein gefälschtes Objekt einzuwickeln:

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

und teste mit

expect(fakeElement.fakeMethod).toHaveBeenCalled();

Dies funktioniert auch nicht, da der Spion nicht funktioniert hat

124
Chetter Hummin

Wenn Sie Ihre Funktion definieren:

function test() {};

Dann ist das äquivalent zu:

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

spyOn(window, 'test') sollte also funktionieren.

Wenn dies nicht der Fall ist, sollten Sie auch in der Lage sein:

test = jasmine.createSpy();

Wenn keine davon funktioniert, läuft in Ihrem Setup etwas anderes.

Ich glaube nicht, dass Ihre fakeElement-Technik aufgrund der Vorgänge hinter den Kulissen funktioniert. Die ursprüngliche globalMethod verweist immer noch auf denselben Code. Was Spionage tut, ist Proxy, aber nur im Kontext eines Objekts. Wenn Sie den Testcode über das fakeElement aufrufen können, funktioniert es, aber Sie können die globalen fns aufgeben.

139
ndp

TypeScript-Benutzer:

Ich kenne das OP nach Javascript, aber für alle TypeScript-Benutzer, die auf dieses Problem stoßen und eine importierte Funktion ausspionieren möchten, können Sie Folgendes tun.

Konvertieren Sie in der Testdatei den Import der Funktion von hier aus:

import {foo} from '../foo_functions';

x = foo(y);

Zu diesem:

import * as FooFunctions from '../foo_functions';

x = FooFunctions.foo(y);

Dann kannst du FooFunctions.foo :) ausspionieren

spyOn(FooFunctions, 'foo').and.callFake(...);
// ...
expect(FooFunctions.foo).toHaveBeenCalled();
40

Es gibt 2 Alternativen, die ich verwende (für Jasmin 2)

Diese ist nicht ganz explizit, da die Funktion scheinbar eine Fälschung ist.

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

Die zweite ausführlicher, expliziter und "sauberer":

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

-> Jasmin-Quellcode , um das zweite Argument zu sehen 

39
IxDay

Ein sehr einfacher Weg:

import * as myFunctionContainer from 'whatever-lib';

const fooSpy = spyOn(myFunctionContainer, 'myFunc');
7
FlavorScape
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();
            })

Das hat bei mir funktioniert.

0
Sushil