web-dev-qa-db-ja.com

Jasmineを使用してオブジェクトのない関数をスパイする

私はジャスミンが初めてで、使い始めたばかりです。私は、どのオブジェクトにも関連付けられていない(つまりグローバルな)多くの関数を含むライブラリjsファイルを持っています。これらの機能をスパイするにはどうすればよいですか?

ウィンドウ/ドキュメントをオブジェクトとして使用しようとしましたが、関数が呼び出されたにもかかわらず、スパイは動作しませんでした。また、私は次のように偽のオブジェクトでラップしようとしました:

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

そしてテスト

expect(fakeElement.fakeMethod).toHaveBeenCalled();

スパイが動作しなかったため、これも動作しません

136
Chetter Hummin

関数を定義している場合:

function test() {};

次に、これは次と同等です。

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

したがって、spyOn(window, 'test')は機能するはずです。

そうでない場合は、次のこともできるはずです。

test = jasmine.createSpy();

どれも機能していない場合は、セットアップで何か他のことが行われています。

あなたのfakeElementテクニックは、舞台裏で起こっていることのために機能するとは思わない。元のglobalMethodは引き続き同じコードを指します。スパイが行うのはプロキシですが、オブジェクトのコンテキストでのみです。テストコードをfakeElementを介して呼び出すことができれば機能しますが、グローバルfnsを放棄することができます。

147
ndp

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();
52

私が使用する2つの選択肢があります(ジャスミン2用)

この関数は実際には偽物であると思われるため、これはあまり明確ではありません。

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

2番目に詳細で、より明確で、「よりクリーン」なもの:

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

-> ジャスミンソースコード 2番目の引数を見る

40
IxDay

非常に簡単な方法:

import * as myFunctionContainer from 'whatever-lib';

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

これは私のために働いた。

1
Sushil