2012-03-01 3 views
112

저는 재스민을 처음 사용하고 방금 사용하기 시작했습니다. 나는 어떤 객체와도 관련이없는 많은 기능을 가진 라이브러리 js 파일을 가지고있다 (즉, 전역 적이다). 어떻게 이러한 기능에 대해 감시하고 있습니까?쟈스민을 사용하여 객체가없는 기능을 간첩

윈도우/문서를 객체로 사용해 보았지만 함수가 호출 되더라도 스파이가 작동하지 않았습니다.

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

expect(fakeElement.fakeMethod).toHaveBeenCalled(); 

와 테스트 당신의 함수를 정의하는 경우 스파이

답변

126

를 작동하지 않았다으로이 중 하나가 작동하지 않습니다를 다음과 같이 나 또한 가짜 객체에 포장 시도 :

: 다음

function test() {}; 

,이 동등

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

그래서 spyOn(window, 'test')이 작동합니다. 그 중 어느 것도 작동하지 않으면, 뭔가 다른 셋업으로 진행되고

test = jasmine.createSpy(); 

: 그없는 경우

, 당신도 할 수 있어야한다.

무의식 중에 일어나는 일 때문에 당신의 fakeElement 기술이 작동하지 않는다고 생각합니다. 원래의 globalMethod는 여전히 동일한 코드를 가리 킵니다. 스파이 행위는 프록시 역할을하지만 오브젝트의 컨텍스트에서만 가능합니다. fakeElement를 통해 호출하도록 테스트 코드를 얻을 수 있다면 작동하지만 전역 FN을 포기할 수 있습니다. 이 함수가 실제로 가짜 것 같다 때문에

+1

그것은했다! 이전에 작성한 오류는 메서드 대신 method()를 사용하여 spyOn을 호출한다는 것입니다. 감사! –

+2

'창'이 지정되지 않아서 자동화의 일부로 테스트를 실행하기 위해 chutzpah를 사용하여 spyOn (창, '테스트')을 사용하는 데 몇 가지 문제가있었습니다. jasmine.createSpy()를 사용하면이 문제가 발생합니다. – Henners

+5

jasmine.createSpy()가 완벽하게 작동했습니다. 감사! – dplass

36

내가 (자스민 2) 사용이 대안

이 하나가 확실히 명시되지 있습니다.

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

두 번째, 더 자세한 더 명시하고, "청소기"

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

->jasmine source code가 두 번째 인수를 참조

+0

이것은 조금 더 의미가 있으며 성공으로 복제 할 수있을만큼 멀리 떨어져 있습니다. +1. 고마워요, C__ – CSS

22

타이프 라이터 사용자에게 : 내가 아는

OP는 javascript에 대해 물었습니다. 그러나 가져온 함수를 간첩하고 싶어하는이 모든 유형의 사용자는 wh 당신이 할 수 있습니다.테스트 파일에서

이에서 함수의 가져 오기를 변환 :

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

TypeScript 힌트 주셔서 감사합니다. ES6/Babel에서도 동일해야하지만 시도하지는 않았습니다. – hgoebl

+0

별칭 FooFunctions **를 사용하여 ** 함수를 명시 적으로 호출하는 경우에만 작동합니다. 나는 baz()를 반환하는 팩토리이며 baz()가 foo()를 호출하는지 테스트하려고하는 함수 막대()가 있습니다. 이 방법은 해당 시나리오에서 작동하지 않습니다. 별명이 foo_functions 내부에 가지고가는 경우에 –

+1

이 작동합니다 '수출 CONST FooFunctions = {바, foo는}'이 시험에서 가져 오기는하지만 foo_functions'.' ../ '에서 '수입 {FooFunctions를}이된다 , 스파이가 작동하기 위해서는 foo_functions private 구현 내에서 별칭을 명시 적으로 사용해야합니다. 'const result = FooFunctions.foo (params)'// 스파이가 전화를 걸어보고 'const result = foo (params)'// 스파이가 전화를 걸지 않는다. –

-1

감시 할 수 창을 정의하지 않고도 가능해야합니다. 전역 기능. 시도 :

var x = function() {} 

    spyX = spyOn(x, 'call') // 

    // something, that calls x 
    expect(spyX).toBeCalled() 
3

아주 간단한 방법 :

import * as myFunctionContainer from 'whatever-lib'; 

const fooSpy = spyOn(myFunctionContainer, 'myFunc'); 
관련 문제