programing

AngularJS / Jasmine 테스트에서의 모킹 데이트

powerit 2023. 4. 3. 21:47
반응형

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.jskarma.conf.conf 파일 속성에도 있습니다.

언급URL : https://stackoverflow.com/questions/17086320/mocking-dates-in-angularjs-jasmine-tests

반응형