私はジャスミンが初めてで、使い始めたばかりです。私は、どのオブジェクトにも関連付けられていない(つまりグローバルな)多くの関数を含むライブラリjsファイルを持っています。これらの機能をスパイするにはどうすればよいですか?
ウィンドウ/ドキュメントをオブジェクトとして使用しようとしましたが、関数が呼び出されたにもかかわらず、スパイは動作しませんでした。また、私は次のように偽のオブジェクトでラップしようとしました:
var fakeElement = {};
fakeElement.fakeMethod = myFunctionName;
spyOn(fakeElement, "fakeMethod");
そしてテスト
expect(fakeElement.fakeMethod).toHaveBeenCalled();
スパイが動作しなかったため、これも動作しません
関数を定義している場合:
function test() {};
次に、これは次と同等です。
window.test = function() {} /* (in the browser) */
したがって、spyOn(window, 'test')
は機能するはずです。
そうでない場合は、次のこともできるはずです。
test = jasmine.createSpy();
どれも機能していない場合は、セットアップで何か他のことが行われています。
あなたのfakeElement
テクニックは、舞台裏で起こっていることのために機能するとは思わない。元のglobalMethodは引き続き同じコードを指します。スパイが行うのはプロキシですが、オブジェクトのコンテキストでのみです。テストコードをfakeElementを介して呼び出すことができれば機能しますが、グローバルfnsを放棄することができます。
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();
私が使用する2つの選択肢があります(ジャスミン2用)
この関数は実際には偽物であると思われるため、これはあまり明確ではありません。
test = createSpy().and.callFake(test);
2番目に詳細で、より明確で、「よりクリーン」なもの:
test = createSpy('testSpy', test).and.callThrough();
-> ジャスミンソースコード 2番目の引数を見る
非常に簡単な方法:
import * as myFunctionContainer from 'whatever-lib';
const fooSpy = spyOn(myFunctionContainer, 'myFunc');
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();
})
これは私のために働いた。