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
'Nice programing' 카테고리의 다른 글
자바 스레드 선호도 (0) | 2020.12.05 |
---|---|
포물선 배낭 (0) | 2020.12.05 |
HTML5 비디오의 경우 mp4 및 ogg로 변환하기위한 ffmpeg 설정 (0) | 2020.12.05 |
"스레드 0x22c8이 코드 259 (0x103)와 함께 종료되었습니다."라는 메시지가 나타나는 이유는 무엇입니까? (0) | 2020.12.05 |
Fat Arrow 클래스 메서드를 허용하도록 ESLint를 구성하는 방법 (0) | 2020.12.05 |