AngularJS / Jasmine 테스트에서의 모킹 데이트
여러 함수로 Date 객체를 여러 번 초기화하는 지시문이 있습니다.유닛에서 개별 기능을 테스트할 때 다음과 같은 날짜 스텁을 처리할 수 있습니다.
(function (global) {
var NativeDate = global.Date;
global.stubDateConstructor = function (fakeDate) {
global.Date = function () {
global.Date = NativeDate;
return fakeDate;
}
}
}(this));
// ageInYears()
it("should return the age in years of the person given his/her birthdate", function() {
stubDateConstructor(new Date('2010/01/01'));
expect(ageInYears('01-01-1990')).toBe(20);
stubDateConstructor(new Date('2010/01/01'));
expect(ageInYears('01-01-1900')).toBe(110);
});
ageInYears 및 기타 유사한 함수를 호출하는 디렉티브 자체를 언티스트하는 경우 Date() stubDateConstructor에 한 번 호출하면 Date()가 실제 Date 객체로 리셋됩니다.
AngularJS/Jasmine은 이러한 상황에 대처할 수 있는 네이티브 방법이 있습니까?아니면 Sinon을 조사해야 합니까?
Jasmine (2.2) 시계는 날짜와 시간을 조롱할 수 있습니다.
http://jasmine.github.io/2.2/introduction.html#section-Mocking_the_Date
예를 들어 (docs에서) 다음과 같이 입력합니다.
it("mocks the Date object and sets it to a given time", function() {
var baseTime = new Date(2013, 9, 23);
jasmine.clock().mockDate(baseTime);
jasmine.clock().tick(50);
expect(new Date().getTime()).toEqual(baseTime.getTime() + 50);
});
간단한 해결책은 Angular를 생성하는 것입니다.Dates
제공하는 서비스Date
오브젝트 - 단일 메서드일 수도 있습니다.Dates.now()
- 현재 날짜만 반환하면 됩니다.new Date()
그런 다음 현재 날짜를 얻어야 할 때마다 이 서비스를 사용할 수 있습니다.
그러면 다른 것을 주입할 수 있습니다.Dates
장치 테스트 시 서비스(예를 들어 호출 시 현재 시간이 아닌 선택한 특정 날짜를 항상 반환하는 서비스)입니다.
angular.discloss(각선).여기서 TzDate는 더 나은 네이티브 대안이 될 것입니다.이는 앵글모크로부터 도우미로 제공되며 시스템 시간대 또는 기타 종속성으로부터 테스트를 안전하게 보호합니다.
https://docs.angularjs.org/api/ngMock/type/angular.mock.TzDate
이것은 재스민이나 모카와 잘 어울린다
윈도우의 타이머를 조롱하는 시논의 가짜 타이머와 시간의 변화를 인식하는 앵귤의 모의 간격 서비스의 조합을 사용하여 조롱할 수 있었다.여기서 테스트 대상 countDownService는 양쪽 javscript를 내부적으로 사용합니다.Date
앵글의 정상 간격 서비스 같은 거:
describe('when start time was 3000 milliseconds and 1001 milliseconds have passed', function() {
var startTime;
var elapse;
beforeEach(function(){
this.clock = sinon.useFakeTimers();
startTime = 3000;
elapse = 1001;
});
var elapseMillis = function(intervalMock,sinonClock,millis){
sinonClock.tick(millis);
intervalMock.flush(millis);
};
it('elapsedMillis + timeRemainingMillis should == startime',
inject(function($rootScope,$interval,countdownService) {
countdownService.startTimer(startTime);
elapseMillis($interval,this.clock,elapse);
//jasmine clock does not mock Date
//see https://github.com/pivotal/jasmine/issues/361
var elapsedMillis = countdownService.getElapsedMillis();
var timeRemainingMillis = countdownService.getTimeRemainingMillis();
expect(elapsedMillis + timeRemainingMillis).toEqual(startTime);
expect(elapsedMillis).toEqual(elapse);
}));
afterEach(function(){
this.clock.restore();
startTime = 0;
elapse = 0;
});
});
sinon js를 확실히 하고 포함시키는 것이 좋습니다.sinon-timers-1.8.1.js
karma.conf.conf 파일 속성에도 있습니다.
언급URL : https://stackoverflow.com/questions/17086320/mocking-dates-in-angularjs-jasmine-tests
'programing' 카테고리의 다른 글
검색되지 않은 유형 오류: 'in' 연산자를 사용하여 다음 위치에서 'length'를 검색할 수 없습니다. (0) | 2023.04.03 |
---|---|
Respect.js: 기본값을 프로펠러로 설정 (0) | 2023.04.03 |
JSON 반환이 jquery로 비어 있는지 확인하는 방법 (0) | 2023.04.03 |
클라이언트와 서버 간에 비즈니스 로직이 반복되지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.04.03 |
매트릭스 치수를 유지하면서 numpy 어레이를 시리얼화하려면 어떻게 해야 합니까? (0) | 2023.04.03 |