2017-10-11 10 views
0

私の使用例は、操作Aが前の暦月に起こっていない限り、操作Bを妨げるUIを持っていることです(会計ライフサイクルの狂気 - は関係ありません)。分度器でブラウザの日付を変更する方法

操作Bが正常に動作していることを確認するテストを作成していますが、先月に操作Aが発生しない限り、操作Bは動作しません。私の分度器の設定は実際のAPIの上で実行され、嘲笑するデータは私が考慮するオプションではありません(私はAPIの応答を模擬することを選択した場合、これは簡単だろう)。

APIは操作Aの作成/更新日を操作できないため、このシナリオをテストするオプションは、基礎となるDBを操作するか、テスト中に次の月にブラウザをプッシュすることです。私はブラウザのアプローチを採用したいと考えていますが、これを分度器でどうやって動作させることができますか?その後、

答えて

0

私は、ブラウザの時間を操作するためのメカニズムを持っていたら、その後、私が選んだ解決策は、シナリオを開始し、動作Aを実行し、将来的には1ヶ月にブラウザの時間を進めることだったが、動作Bを行う

この分度器browser.executeScriptを使用してブラウザコンテキストでJSを実行し、timeshift-jsモジュールを使用してJS Dateオブジェクトを上書きします。角度

  • :1.5.10
  • 分度器:5.1.2
  • キュウリ-JS:1.3.3
  • タイムシフトここ

    このコードが使用しているコードであります-js:1.0.1

私はこのようなシナリオを書くことができます:

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 

ここにステップの実装があります。

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

考慮事項:

  • トリッキーな部分がタイムシフト-JSライブラリを直列化され、フレームワーク/説明ベースのジャスミンやモカに適応するのは簡単でなければなりませんので、ここでは何もキュウリの特定はありません。それは私はあなたが明示的に行くとhttps://github.com/angular/protractor/blob/master/docs/faq.md#how-can-i-get-hold-of-the-browsers-console
  • はあなたがブラウザを操作することはできません使用してそれらを取得しない限り、あなたは、ブラウザのログが表示されませんテスト
  • 時にオンデマンドでそれを注入することがありましたので、私は、私のアプリでそれをパッケージ化したくありませんでしたあなたが少なくとも1つのページを取得するまでの時間、ブラウザーのJSコンテキストで日付を操作する前にブラウザーにいくつかのHTMLとJSがロードされている必要があります
関連する問題