2017-10-11 2 views
0

Mein Anwendungsfall ist, dass ich eine Benutzeroberfläche habe, die Operation B verhindert, es sei denn, Operation A im vorherigen Kalendermonat (Accounting Lifecycle Madness - spielt keine Rolle).So ändern Sie das Browserdatum im Winkelmesser

Ich schreibe einen Test, der überprüft, ob Operation B korrekt funktioniert, aber ich kann Operation B nicht ausführen, es sei denn, ich habe Operation A, die letzten Monat aufgetreten ist. Mein Winkelmesser-Setup wird über echten APIs ausgeführt, und das Mocking von Daten ist keine Option, die ich in Erwägung ziehen werde (gewährt, wenn ich API-Antworten nachahmen würde, wäre dies einfacher).

Die APIs erlauben es mir nicht, die Erstellungs-/Aktualisierungsdaten von Operation A zu manipulieren, daher besteht meine Möglichkeit, dieses Szenario zu testen, darin, die zugrunde liegende DB zu manipulieren oder den Browser während des Tests in den nächsten Monat zu schieben. Angenommen, ich möchte den Browser-Ansatz verwenden, wie kann ich das mit Winkelmesser arbeiten?

Antwort

0

Sobald ich einen Mechanismus Browser Zeit zu manipulieren, dann ist die Lösung, die ich war wählte ein Szenario beginnen, den Betrieb A ausführen, die Browser-Zeit bis zu einem Monat in der Zukunft voranbringen, dann wird der Betrieb B. ausführen

Dieses involvierte mit Winkelmessern browser.executeScript, um JS im Browser-Kontext auszuführen, und überschreiben Sie das JS-Date-Objekt mit dem Modul timeshift-js. Hier

ist der Code

Dieser Code verwendet:

  • Winkel: 1.5.10
  • Winkelmesser: 5.1.2
  • Gurken-js: 1.3.3
  • Timeshift -js: 1.0.1

Ich kann Szenarien wie folgt schreiben:

Feature: Travelling in time 

    Scenario: Scenario that manipulates time 
    When I view some page 
    And I check what time it is 
    And I do operation A 
    And I advance the browser by 1 days 
    And I check what time it is 
    Then I can do operation B 

    Scenario: Scenario Double Check that the next scenario gets the correct time 
    When I view the list of maintenance requests 
    And I check what time it is 

Und hier ist die Schritt-Implementierung. Es gibt hier nichts Gurke spezifisch, so dass es einfach sein sollte zu einem Jasmin oder Mokka anzupassen basiert beschreiben/it Rahmen:

const timeShiftLibraryString = fs.readFileSync(`path/to/node_modules/timeshift-js/timeshift.js`, 'utf-8') 

module.exports = function() { 

    this.When(/I advance the browser by (-?[0-9]+) (day|month)s?$/, function (offset, unit) { 
    const now = moment() 
    const future = moment().add(offset, unit) 
    const amountOfMillisecondsToAdvanceBrowser = (future.unix() - now.unix()) * 1000 
    const tolerance = 15 * 1000 

    const advanceTime = function (futureOffsetInMilliseconds, timeShiftLibraryString) { 
     // these two lines are only necessary because I dont want Timeshift in my production code, only during test 
     const timeshiftLibrary = new Function(timeShiftLibraryString) 
     timeshiftLibrary.call(window) 

     Date = window.TimeShift.Date 
     window.TimeShift.setTime(Date.now() + futureOffsetInMilliseconds) 
     return Date.now() 
    } 

    return browser.executeScript(advanceTime, amountOfMillisecondsToAdvanceBrowser, timeShiftLibraryString).then((browserTime) => { 
     const expectedTime = Date.now() + amountOfMillisecondsToAdvanceBrowser - tolerance 
     this.logger.debug(`Time manipulation complete: browserTime = ${moment(browserTime)}`) 
     if (browserTime >= expectedTime) { 
     return Promise.resolve(browserTime) 
     } 

     return Promise.reject(new Error(`advanceTime did not work: reported browserTime: ${browserTime}. Expected Time: ${expectedTime}`)) 
    }) 
    }) 

    this.When(/I check what time it is/, function() { 
    const whatTimeIsItInTheBrowser = function() { 
     return Date.now() 
    } 
    return browser.executeScript(whatTimeIsItInTheBrowser).then((browserTime) => { 
     console.log(`Browser Time = ${moment(browserTime)}`) 
    }) 
    }) 
} 

Überlegungen:

  • der schwierige Teil ist die Timeshift-js Bibliothek Serialisierung. Ich wollte es nicht mit meiner Anwendung verpacken, so dass bedeutete, dass ich es während der Test
  • auf Nachfrage zu injizieren hatte werden Sie nicht die Browser-Protokolle sehen wenn Sie sie ausdrücklich gehen und sich mit https://github.com/angular/protractor/blob/master/docs/faq.md#how-can-i-get-hold-of-the-browsers-console
  • Sie den Browser nicht manipulieren kann Zeit, bis Sie mindestens eine Seite abgerufen haben, muss der Browser einige HTML und JS geladen haben, bevor Sie Datum im Browser JS-Kontext
manipulieren können
Verwandte Themen