2013-06-13 11 views
27

Posiadam dyrektywę, która kilka razy inicjalizuje obiekt Date w kilku funkcjach. Kiedy Jednostka testowania poszczególnych funkcji może obsłużyć stubbing datę takiego:Dni kpin w testach AngularJS/Jasmine

(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); 
}); 

Na test jednostkowy samej dyrektywy, która wywołuje ageInYears i kilka innych podobnych funkcji nie będzie działać jak I po jednej rozmowy to Date() stubDateConstructor będzie resetować Date() do prawdziwego obiektu Date.

Czy w AngularJS/Jasmine jest rodzimy sposób radzenia sobie z takimi sytuacjami, czy powinienem zaglądać do Sinona, np.?

+0

to świta na mnie teraz, że mogę mieć aby raz zainicjować datę i przekazać ją funkcjom wymagającym. Może to najlepsze rozwiązanie? – Maarten

+0

Sam jestem fanem Timecop.js. Każda biblioteka z funkcjami takimi jak Timecop.travel i Timecop.freeze uzyska moją zgodę. – ivarni

+0

Wygląda na to, że sinon.js może również zapewnić kpiny czasowe dotyczące dat (zależne od obsługi przeglądarki) http://sinonjs.org/docs/#clock – ossek

Odpowiedz

50

Jaśmin (2.2) Zegar może kpić z dat i godzin.

http://jasmine.github.io/2.2/introduction.html#section-Mocking_the_Date

Na przykład (od 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); 
}); 
+0

dziękuję, wygląda na to, że nie istniało z powrotem, gdy zapytałem, ale wydaje się być właściwym narzędziem – Maarten

12

Prosty rozwiązaniem byłoby stworzenie kątowym Dates usługę, która zapewnia Date obiektów dla Ciebie - może mieć nawet tylko jedną metodę - Dates.now() - że po prostu odsyła bieżącą datę wracając new Date(). Następnie korzystasz z tej usługi za każdym razem, gdy pojawi się aktualna data.

Umożliwia to wstrzyknięcie innej usługi Dates podczas testowania urządzenia, na przykład takiego, które zawsze zwraca wybraną datę wyboru podczas połączenia, zamiast aktualnego czasu.

+0

Tak prosty, mój umysł błąkał się po różnego rodzaju głupich, zbyt skomplikowanych scenariuszach . Dzięki stary! – rooftop

0

Udało mi się sfałszować przy użyciu kombinacji sinon's fake timers, aby sfałszować zegary okien i kątowe mock interval service dla kątowego rozpoznawania zmian czasu. Tutaj countDownService badany korzysta wewnętrznie zarówno javscript Date i kątowego normalne interval service coś takiego:

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; 
    }); 
    }); 

Będziemy chcieli, aby upewnić się, i to sinon js na sinon-timers-1.8.1.js w swoim karma.conf.js plików nieruchomości, zbyt .