2017-01-09 3 views
0

x은 외부 라이브러리이고 Thingx에서 생성 할 수있는 개체라고 가정합니다.생성자 "x.Thing()"에 대한 조롱/도용

app.service('thingService', function() { 
    var thing; 

    this.createThing = function(thingParam){ 
     thing = new x.Thing(thingParam); 
    } 
}); 

내 최초의 시도가이 포함 :이 모든과 같이, 각도 서비스에 싸여

xSpy = jasmine.createSpyObj('x', ['Thing']); 
spyOn(window, 'x').andReturn('xSpy'); 

을하지만 여전히 불평 Thing가 구축되어야한다 그 라인에 x() method does not exist

답변

-1

귀하의 시도

xSpy = jasmine.createSpyObj('x', ['Thing']); 
spyOn(window, 'x').andReturn('xSpy'); 

은 wr입니다. 옹 : x이 작동하지 않습니다 객체이기 때문에

spyOn()방법 스파이와을 대체합니다. 따라서 x() method does not exist 예외가 발생합니다.

describe("Test", function() { 
    var origThing; 

    beforeEach(function() { 
     // create spy object for Thing that provides its methods 
     var mockedThingInterface = jasmine.createSpyObj('Thing', ['methodA', 'methodB']); 

     mockedThingInterface.methodA.and.returnValue(1); 
     mockedThingInterface.methodB.and.returnValue(2); 

     // remember original constructor 
     origThing = x.Thing; 

     // replace the constructor 
     x.Thing = function() { 
      return mockedThingInterface; 
     } 
    }); 

    afterEach(function() { 
     // restore when finished 
     x.Thing = origThing; 
    }); 

    it("should ...", function() { 
     // ... 
    }); 
}); 
+0

를하지만이 (서비스의'createThing' 방법) 테스트되고있는 코드에서 x''의 사용을 해결하지 않는 것 :

그냥 속성을 대체 할 수 있습니다 예를 들어 가정. 테스트에 코드를 추가하면 테스트를 실행할 때'ReferenceError : 변수를 찾을 수 없습니다 : x'가됩니다. –

+0

'thing'만으로 간첩하고 싶다고 생각했습니다. 전체'x'를 바꾸려면 한 수준 위로 올라가서'x'를 기억하고'window.x'를 대체하십시오 ('x'는 실제로 전역입니다). 'x'가 전역 변수가 아니라면, 예제를 명확히하십시오. 언급 한 오류가이를 지적합니다. –