2016-04-18 7 views
1

私は実際に私の角型アプリケーションの単体テストを終了しています。私は現在、分度器とジャスミンを使ってE2Eテストを行っています。残念ながら、私は以下の問題を抱えています:道具がdone()メソッドなしでテストに合格しない

私はhttp://ramonvictor.github.io/protractor/slides/#/1のようなオンラインのリサーチをオンラインで行いました。私は明らかにテストを開始するための "done"コールバックの使用は見かけません。

この最初のテストでは、createUserページに進み、ユーザータブの属性がアクティブに設定されていることを確認します。私が使ってはならないdoneメソッドを使用する場合にのみ渡されます。

'use strict'; 
 

 
var UserCreate = require('./page-objects/userCreate.pageObjects'); 
 

 
describe('on init', function() { 
 

 
    beforeEach(function() { 
 
     var rootUrl = browser.baseUrl + '/#/users/create'; 
 
     browser.driver.get(rootUrl); 
 
    }); 
 

 
    it('should set the user tab active', function(done) { // DONE callback 
 
     UserCreate.tabs.getAttribute('class').then(function(value) { 
 
      expect(value).toEqual('active'); 
 
      done(); // calling callback 
 
     }); 
 
    }); 
 
});

I)が(完了を使用せずに同じテストを繰り返した場合、テストはしても、この時間ならば、私はにそれをしたいに失敗渡します。

'use strict'; 
 

 
var UserCreate = require('./page-objects/userCreate.pageObjects'); 
 

 
describe('on init', function() { 
 

 
    beforeEach(function() { 
 
     var rootUrl = browser.baseUrl + '/#/users/create'; 
 
     browser.driver.get(rootUrl); 
 
    }); 
 

 
    it('should set the user tab active', function() { 
 
     UserCreate.tabs.getAttribute('class').then(function(value) { 
 
      expect(value).toEqual('activeWRONG'); 
 
     }); 
 
    }); 
 
});

私が行ったコールバックを使用する場合にのみ失敗します。私はどこにでも行っての使用とのより深いテストで非同期に問題が発生しますので、私は私のテストを続行する前にこの問題を解決したい

/* conf.js */ 
 
' use strict'; 
 

 
exports.config = { 
 
rootElement: '#myApp', 
 
directConnect: true, 
 
seleniumAddress: 'http://localhost:4444/wd/hub', 
 
capabilities: { 
 
    browserName: 'chrome', 
 
    shardTestFiles: true, 
 
    maxInstances: 1 
 
}, 
 
framework: 'jasmine', 
 
// specs: ['./*.spec.js'], 
 
baseUrl: 'http://localhost:9001', 
 
defaultTimeoutInterval: 0000, 
 
jasmineNodeOpts: { 
 
    showColors: true, 
 
}, 
 
suites: { 
 
    wip:  './userCreate.spec.js', 
 
    all:  './*spec.js' 
 
}, 
 
onPrepare: function() { 
 
    browser.driver.get('http://localhost:9001/#/'); 
 
    element(by.id('ld-link-login')).click(); 
 
    browser.sleep(500); 
 

 
    element(by.model('username')).sendKeys('test'); 
 
    element(by.model('password')).sendKeys('test'); 
 
    element(by.id('nv-login-submit')).click(); 
 

 
    return browser.driver.wait(function() { 
 
     return browser.driver.getCurrentUrl().then(function(url) { 
 
      return /dashboard/.test(url); 
 
     }); 
 
    }, 10000); 
 
} 
 
};

:ここ

は私の設定ファイルです。

ありがとうございました。

編集:

分度器のバージョンは:./node_modules/.bin/protractorの--versionを与えバージョン3.2.2

userCreate.pageObjects:

'use strict'; 
 

 
module.exports = { 
 
    tabs: element(by.id('cc-tab-user')) 
 
    };

+0

Jasmine2にアップグレードできますか? – Gunderson

+0

私はjasmine.versionでチェックアウトし、ジャスミンのバージョンは2.4.1です。 –

+0

あなたの設定は 'jasmine'と言って、' framework: 'jasmine2'、 'に変更し、それが役立つかどうか確認してください。 – Gunderson

答えて

0

これは予想される動作です。 done()機能を要求しない場合、ジャスミンはあなたのテストを同期とみなし、約束が解決されるのを待つことなく終了します。 これを求めると、テストは非同期になり、タイムアウト(デフォルトでは5秒)前にdone()が呼び出されていないと失敗します。 参照:http://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support詳細については、

+2

これはProtractorでは期待されていません.Jasmineに非同期にパッチを当て、各spec/testには独自のcontrolFlowがあり、そのキューが空のときにイベントをトリガーします。 https://github.com/angular/protractor/blob/master/docs/control-flow.md – Gunderson

0

プロミスの解決順序の問題につながるPage Objectを定義する方法に問題があります。 style guideをフォローし、それを変更します。

var UserCreatePage = function() { 
    this.tabs = element(by.id('cc-tab-user')); 
}; 

module.exports = UserCreatePage; 

使用法:あなたのテストは、あなたのテストの制御フローにおける並列タスクキューを作成した場合

'use strict'; 

var UserCreatePage = require('./page-objects/userCreate.pageObjects'); 

describe('on init', function() { 
    var userCreatePage; 

    beforeEach(function() { 
     var rootUrl = browser.baseUrl + '/#/users/create'; 
     browser.driver.get(rootUrl); 

     userCreatePage = new UserCreatePage(); 
    }); 

    it('should set the user tab active', function() { 
     userCreatePage.tabs.getAttribute('class').then(function(value) { 
      expect(value).toEqual('activeWRONG'); 
     }); 
    }); 
}); 
+0

ちょっと!もう一度お返事いただきありがとうございます。私はあなたの言ったように私のUserObject構造を変更しましたが、私はまったく同じ問題を抱えています。コードとの唯一の違いは、オブジェクトをインスタンス化するための "new"キーワードです(オブジェクトなしのエラー)。私のテストはdoneメソッドがなくても実行されませんが、私が使用するとまだ動作します。私は本当にこのすべてについて絶望的に感じています。とにかく助けてくれてありがとう。 –

+0

@ XimaBrabTobraこの理論はこの問題に適していました! :)ペ​​ージオブジェクトを 'function()'として定義し、実際のテストの中でのみ 'new()'を呼び出すことはできますか?ありがとう。 – alecxe

+0

これは正しいと思われ、別の根本的な問題がなければ機能するはずです。 – Gunderson

0

この動作が発生することがあります。what done() is for and how to use it (protractor, jasmine)については、私はこれのために一貫性のない結果を与えるテストのいくつかの例を書いた。 -

console.log(protractor.promise.controlFlow().getSchedule(false)); 
0

あなたの問題は、あなたがあなたのexpectに向けvalueを渡すためにthen()を使用すること、である:これはあなたの問題であれば、あなたのテストのさまざまなポイントでの制御フローをプリントアウトすることができますを把握する

ステートメント。 then()は、サブタスクとして破棄される新しい非同期タスクを作成します。この結果、itは最初にresult = successで終了し、expect文が実行されます。 Promise/ControlFlow documentation of Seleniumに記載されています。

expect()はすでに約束を解除/解決しているため、then()は必要ありません。

doneを使用すると、実行を制御し、then()が完了する前にitが続行/終了するのを防ぐため、動作します。

'use strict'; 

var UserCreate = require('./page-objects/userCreate.pageObjects'); 

describe('on init', function() { 

    beforeEach(function() { 
     var rootUrl = browser.baseUrl + '/#/users/create'; 
     browser.driver.get(rootUrl); 
    }); 

    it('should set the user tab active', function() { 
     expect(UserCreate.tabs.getAttribute('class')).toEqual('activeWRONG'); 
    }); 
}); 
0

それが原因で、あなたのコード内で適切に実行されていない制御フローは次のとおりです。

はこれを試してみてください。制御フローは、タスクとタスクキューの概念に基づいています。タスクは、制御フローが実行されるための基本作業単位を定義する関数です。各タスクは、ControlFlow#execute()を介してスケジュールされ、タスクの結果で解決されるManagedPromiseが返されます。

次のように動作するはずです。

let UserCreate = require('./pageobject.page.js'); 
describe('should navigate to url', function() { 
    beforeEach(function() { 
     url = `${browser.baseUrl}/#/users/create`; 
     browser.driver.get(url); 
    }); 
    it('should set the user tab active', function() { 
    expect(UserCreate.tabs.getAttribute('class')).toEqual('activeWRONG'); 
    }); 
});