2016-05-06 6 views
4

私は複数のスペックを含むスイートを持っています。各仕様は、失敗時に拒否された約束を返すライブラリのコードを使用します。特定の条件でSpecから投光器テストを終了するには?

私は簡単にcatch私の仕様の中でそれらの拒否された約束をすることができます。私が思っているのは、同じスイート内の次のスペックが以前のスペックの成功に依存しているため、プロットツールがその内のスイート全体を終了することができれば、catch関数です。

は、私はこれらの仕様openAppsignIncheckUserlogoutを持ってtestEverythingと呼ばれるスイートを持っているふり。 openAppが失敗すると、依存関係のため次のすべてのスペックが失敗します。

openAppためにこのコードを考えてみましょう:

var myLib = require('./myLib.js'); 

describe('App', function() { 

    it('should get opened', function(done) { 

    myLib.openApp() 
    .then(function() { 

     console.log('Successfully opened app'); 

    }) 
    .catch(function(error) { 

     console.log('Failed opening app'); 

     if (error.critical) { 
     // Prevent next specs from running or simply quit test 
     } 

    }) 
    .finally(function() { 

     done(); 

    }); 

    }); 

}); 

どのように私は、全体のテストを終了しますか?

答えて

1

私は回避策を思いつきました。私が使った実際のコードはもっと複雑ですが、そのアイデアは同じです。

私はbailという分度器の設定ファイルにグローバル変数を追加しました。 configファイルの先頭に以下のコードを検討:

(function() { 

    global.bail = false; 

})(); 

exports.config: { ... 

上記のコードは、(全試験を通して利用可能である)分度器のglobalオブジェクトにbail変数を定義生命維持(直ちに呼び出された関数式)を使用します。

また、私は必要なジャスミンマッチャーのための非同期ラッパーを書いています。これはexpectの式を実行してから比較し、約束を返します(Qモジュールを使用)。例:次に

var q = require('q'); 

function check(actual) { 

    return { 

     sameAs: function(expected) { 

      var deferred = q.defer(); 
      var expectation = {}; 

      expect(actual).toBe(expected); 

      expectation.result = (actual === expected); 

      if (expectation.result) { 

       deferred.resolve(expectation); 
      } 
      else { 
       deferred.reject(expectation); 
      } 

      return deferred.promise; 

     } 

    }; 

} 

module.exports = check; 

各仕様の終わりに、私はそれらの非同期マッチャーの約束によって決定される仕様の進捗状況に基づいて、bail値を設定します。最初の仕様として、次の点を考慮してください

var check = require('myAsyncWrappers'); // Whatever the path is 

describe('Test', function() { 

    it('should bail on next spec if expectation fails', function(done) { 

     var myValue = 123; 

     check(myValue).sameAs('123') 
     .then(function(expectation) { 

      console.log('Expectation was met'); // Won't happen 

     }) 
     .catch(function(expectation) { 

      console.log('Expectation was not met'); // Will happen 

      bail = true; // The global variable 

     }) 
     .finally(function() { 

      done(); 

     }); 

    }); 

}); 

は最後に、次のスペックの初めに、私はbailをチェックし、必要に応じて返す:

describe('Test', function() { 

    it('should be skipped due to bail being true', function(done) { 

     if (bail) { 

      console.log('Skipping spec due to previous failure'); 

      done(); 

      return; 

     } 

     // The rest of spec 

    }); 

}); 

は今、私は1つのモジュールがそこにありますことを言及したいと思いますprotractor-fail-fastと呼ばれ、期待しないときはいつでも全体のテストに疲れてしまいます。

私の場合、どのタイプの期待に失敗したかに応じて、グローバル変数bailを設定する必要がありました。私は、障害をクリティカルで非クリティカルと区別し、それを使用するライブラリを作成しました。クリティカルな障害が発生した場合にのみ、スペックは停止します。

+0

それはこれに来なければならなかったのでとても悲しいです...私は、私が依存している作業を失敗させてしまうのは、あまり定型的なコードを追加する気がしないからです。私はまったく同じ問題を抱えており、これを行うネイティブな方法はないと私は驚いています。 – Joffrey

+0

@Joffreyコードが長すぎて目的に合っていない場合、私は理解します。 Protractor/Jasmineの組み込み機能は、これほど複雑ではないので、これが必要です。たぶん、Githubレポに問題を追加する必要がありますか? –

2

npmのモジュールがあり、protractor-fail-fastと呼ばれています。モジュールnpm install protractor-fail-fastをインストールします。ここでは、あなたのconfファイルにこのコードを配置します自分のサイトからの例です:

var failFast = require('protractor-fail-fast'); 

exports.config = { 
    plugins: [{ 
    package: 'protractor-fail-fast' 
    }], 

    onPrepare: function() { 
    jasmine.getEnv().addReporter(failFast.init()); 
    }, 

    afterLaunch: function() { 
    failFast.clean(); // Cleans up the "fail file" (see below) 
    } 
} 

彼らのURLがhereです。

+0

私は、最初の失敗した期待に対してテストをしたくないことを認識していますが、エラーが重大である(ログインに失敗した、サインアップに失敗したなど) not(間違ったユーザー名が表示されます)。 –

+0

あなたのスクリプトは、あなたが言うことをやり遂げようとしています。それは自分で考えることはできません。手動でテストを中止する唯一の方法は、「Control + C」キーを押すことです。あなたの質問は、ステップが失敗した場合にテストを停止する方法を尋ねました。これは、私が答えたモジュールができることです。たぶん私はあなたの質問を正しく理解していないでしょう。 –

+0

"私が思っているのは、プロトラクターをそのキャッチ関数**内のスイート全体から抜け出すことができれば** ..."、私はexpectステートメントの非同期ラッパーを持っています。私が具体的に言ったように、私はそれらの拒否された約束を守るときに手動でテストをやめたいと思っています(それらの約束が返ってくるエラーコードが重大なエラーだけを報告している場合)。それが本当の質問です。 –

関連する問題