Nice programing

Jasmine을 사용하여 생성자 감시

nicepro 2020. 12. 5. 10:41
반응형

Jasmine을 사용하여 생성자 감시


Jasmine을 사용하여 특정 개체가 생성되고 메서드가 호출되는지 테스트하고 있습니다.

flipcounter 개체를 만들고 setValue 메서드를 호출하는 jQuery 위젯이 있습니다. flipcounter의 코드는 다음과 같습니다 : https://bitbucket.org/cnanney/apple-style-flip-counter/src/13fd00129a41/js/flipcounter.js

플립 카운터는 다음을 사용하여 생성됩니다.

var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});

플립 카운터가 생성되고 setValue 메서드가 호출되는지 테스트하고 싶습니다. 내 문제는 이러한 개체가 생성되기 전에 어떻게 감시합니까? 생성자를 감시하고 가짜 객체를 반환합니까? 샘플 코드가 정말 도움이 될 것입니다. 당신의 도움을 주셔서 감사합니다! :)

최신 정보:

나는 다음과 같이 flipCounter에서 감시를 시도했습니다.

myStub = jasmine.createSpy('myStub');
spyOn(window, 'flipCounter').andReturn(myStub);

//expectation
expect(window.flipCounter).toHaveBeenCalled();

그런 다음 flipCounter로 setValue 호출을 테스트합니다.

spyOn(myStub, 'setValue');

//expectation
expect(myStub.setValue).toHaveBeenCalled();

flipCounter를 초기화하는 첫 번째 테스트는 괜찮지 만 setValue 호출을 테스트하기 위해 내가 얻는 것은 'setValue () 메서드가 존재하지 않습니다'오류입니다. 이 작업을 올바른 방법으로하고 있습니까? 감사!


flipCounter객체를 생성하더라도 다른 함수일뿐입니다. 따라서 다음을 수행 할 수 있습니다.

var cSpy = spyOn(window, 'flipCounter');

그것에 대한 스파이를 구하고 모든 종류의 검사를 수행하거나 다음과 같이 말하십시오.

var cSpy = spyOn(window, 'flipCounter').andCallThrough();
var counter = flipCounter('foo', options);
expect(cSpy).wasCalled();

그러나 이것은 과잉으로 보입니다. 다음을 수행하는 것으로 충분합니다.

var myFlipCounter = new flipCounter("counter", options);
expect(myFlipCounter).toBeDefined();
expect(myFlipCounter.getValue(foo)).toEqual(bar);

jasmine.createSpyObj()감시해야 할 속성을 가진 개체를 모의하고 싶을 때 사용하는 것이 좋습니다 .

myStub = jasmine.createSpyObj('myStub', ['setValue']);
spyOn(window, 'flipCounter').andReturn(myStub);

이는 구현 flipCounter에 의존하지 않고 예상 인터페이스 와의 상호 작용을 테스트 합니다 flipCounter.


속성을 스파이 함수로 flipCounter설정 하는 가짜 생성자를 구현해야 setValue합니다. 테스트하려는 기능이 다음과 같다고 가정 해 보겠습니다.

function flipIt() {
  var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});
  myFlipCounter.setValue(100);
}

사양은 다음과 같습니다.

describe('flipIt', function () {
  var setValue;
  beforeEach(function () {
    setValue = jasmine.createSpy('setValue');
    spyOn(window, 'flipCounter').and.callFake(function () {
      this.setValue = setValue;
    });
    flipIt();
  });
  it('should call flipCounter constructor', function () {
    expect(window.flipCounter)
      .toHaveBeenCalledWith("counter", {inc: 23, pace: 500});
  });
  it('should call flipCounter.setValue', function () {
    expect(setValue).toHaveBeenCalledWith(100);
  });
});

다음은 '창'에 의존하지 않습니다. 이것이 테스트하려는 코드라고 가정 해 보겠습니다.

function startCountingFlips(flipCounter) {
    var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});
}

당신의 테스트는-

var initSpy = jasmine.createSpy('initFlipCounter');
var flipCounter = function(id, options) {
    initSpy(id, options);
}
startCountingFlips(flipCounter);
expect(initSpy).toHaveBeenCalledWith("counter", {inc:23, pace:500});

생성자를 테스트하는 내 버전은 프로토 타입을 감시하는 것입니다.

spyOn(flipCounter.prototype, 'setValue').and.callThrough();
var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});
expect(flipCounter.prototype.setValue).toHaveBeenCalledTimes(1);

jasmine mocks를 사용하여이 작업을 수행하는 방법을 모르지만 강력한 mocking / spy / stubs를 원한다면 sinon.js를 권장 합니다. jasmine과 매우 잘 작동합니다.

문서에서 :

테스트 스파이는 인수, 반환 값,이 값 및 모든 호출에 대해 throw 된 예외 (있는 경우)를 기록하는 함수입니다. 테스트 스파이는 익명 함수이거나 기존 함수를 래핑 할 수 있습니다.

모의 (및 ​​모의 기대)는 미리 프로그래밍 된 기대뿐만 아니라 미리 프로그래밍 된 동작 (예 : 스텁)이있는 가짜 방법 (예 : 스파이)입니다. 모의가 예상대로 사용되지 않으면 테스트에 실패합니다.

With sinon.js you could create a mock of the flipCounter constructor that returns another spy.

Then assert that the constructor was called using constructorMock.calledWithNew(), and assert that the returned spy was called with returnedSpy.calledWith(arg1, arg2...).

참고URL : https://stackoverflow.com/questions/9347631/spying-on-a-constructor-using-jasmine

반응형