2013-06-26 7 views
32

JasmineJSでテストを書くとき、私はbeforeEach/afterEachの同様のコードを持つ多くのテストをしています。Jasmine JSでBefore/AfterEachを再利用する方法は?

JasmineJSテストスイートを使用して継承モデルを実装する方法はありますか?

すべてのテストを単一のdescribeでグループ化できますが、この場合はすべてのテストを含む単一のHUGE JSファイルで終了します。

各ページのテストを分割したいと思います。ここで

は一例です:

describe('Services Page', function() { 

    beforeEach(function() { 
     login_as_admin() 
    }) 

    beforeEach(function() { 
     browser().navigateTo('/services') 
    }) 

    if('Some test for services page', function() {}) 

    afterEach(function() { 
     logout() 
    }) 

}) 


describe('Administrators Page', function() { 

    beforeEach(function() { 
     login_as_admin() 
    }) 

    beforeEach(function() { 
     browser().navigateTo('/administrators') 
    }) 

    if('Some test for administrators page', function() {}) 

    afterEach(function() { 
     logout() 
    }) 

}) 
+1

は、すべてのページが( 'login_as_adminを持つことになります)'と 'ログアウト()'? – xst

答えて

27

私は、これは部分的にin this blog postを検討してもanswered hereていると思いますが、私はあなたの例のために適した答えを追加している:

再利用可能なコード:それを使用する方法

function sharedSetup(startPage) { 
    beforeEach(function() { 
     login_as_admin(); 
     browser().navigateTo(startPage); 
    }); 

    afterEach(function() { 
     logout(); 
    }); 
}; 

describe('Services Page', function() { 
    sharedSetup('/services'); 

    it('Some test for services page', function() {}); 
}); 

describe('Administrators Page', function() { 
    sharedSetup('/administrators'); 

    it('Some test for administrators page', function() {}); 
}); 
3

ジャスミンは、あなたがdescribeコールのbeforeEachafterEach外を置くことができません。このようにして、すべてのスペックのグローバルなセットアップとティアダウンを行うことができます。あなたのlogout()コールは、グローバルティアダウンのための良い候補かもしれないようですが、すべてのスペックが管理者としてログインしていれば、グローバルスコープにも移動することができます。

一部の、すべてではない仕様で使用されているものについては、login_as_admin()などの方法を使用すると、そのロジックを1か所に統合​​する最良の方法のようです。

0

参考:(Pivotal Labs Blog:Davis W. Frank

彼異なる個々のスイートのためのパラメータで呼び出された関数内で共有機能を収集について説明します。各スイート内でこの関数を呼び出すと、共通の設定/構成が実行されます。

ファイル間のテストの分割については、テストがブラウザベースの場合は<script>タグを、テストがノードベースの場合は最上部近くのrequire(...)で共有機能を持つファイルを各ページに含めることができます。テストは単独で実行できますが、その共有セットアップは1回だけ定義されています。

12

すべてのスイートでこれを行う場合は、beforeEachまたはafterEach機能を01に登録できます:

jasmine.getEnv().topSuite().beforeEach({fn: function() { 
    //log in as admin 
}}); 

あなただけのいくつかのスイートには、それを適用したい場合は、サブのスイートで作業することができます

describe("as_admin", function() { 
    beforeEach(function() { 
    //log in as admin 
    }); 

    describe('Services Page',function() {...}); 
    describe('Administrators Page',function() {...}); 

} 
+0

私はそれも使用することが考えられます: jasmine.getEnv()。beforeEach(function(){ // adminとしてログイン }); ここでの変更に含まれるテストに基づいています:https://github.com/jasmine/jasmine/issues/811 – rajsite

+0

'beforeEach'の' done() 'コールバックを呼び出すことは重要です。 – Vanuan

関連する問題