나는 Jasmine을 처음 사용하고 방금 사용하기 시작했습니다. 객체와 관련이없는 많은 함수가있는 라이브러리 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가 자바 스크립트에 대해 묻는 것을 알고 있지만 가져온 기능을 염탐하려는이 유형의 사용자를 위해 여기에 할 수있는 작업이 있습니다.
테스트 파일에서 함수 가져 오기를 다음에서 변환하십시오.
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 가지 대안이 있습니다 (Jasmine 2 용)
이것은 함수가 실제로 가짜 인 것처럼 보이기 때문에 명확하지 않습니다.
test = createSpy().and.callFake(test);
두 번째로 더 자세하고 명확하며 “더 깨끗합니다”:
test = createSpy('testSpy', test).and.callThrough();
-> 재스민 소스 코드 는 두 번째 인수를 볼 수
답변
매우 간단한 방법 :
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();
})
이것은 나를 위해 일했습니다.
답변
내 대답은 가져온 모듈에 단일 (기본 내보내기) 기능이 있다는 점에서 @FlavorScape와 약간 다릅니다.
import * as functionToTest from 'whatever-lib';
const fooSpy = spyOn(functionToTest, 'default');