2015-10-12 2 views
6

e2eテストで問題が発生しました。 時にはテストが原因Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.プロトラクター/ Jasmine2 - 指定したタイムアウト時間内に非同期コールバックが呼び出されない

に失敗しているが何とかprotracotr.conf.jsに高い値にdefaultTimeoutIntervalを変更BOが、結果には待ち時間が長いですが、エラーが同じである、それを解決しようとしました。失敗したテストと

exports.config = { 
    chromeOnly: true, 
    chromeDriver: '../node_modules/.bin/chromedriver', 
    framework: 'jasmine2', 
    capabilities: { 
     'browserName': 'chrome', 
     shardTestFiles: true, 
     maxInstances: 3 
    }, 
    specs: ['../e2e/protractor/spec/*.js'], 
    jasmineNodeOpts: { 
     showColors: true, 
     defaultTimeoutInterval: 30000, 
     isVerbose: true, 
     includeStackTrace: true, 
    }, 

私の例の仕様:

するvar LoginPage =必要(」../ページ/ login_page.js'); var UsersPage = require( '../ pages/users_page.js'); var WelcomePage = require( '../ pages/welcome_page.js');

describe('Test -> my test', function() { 
    var loginPage; 
    var EC = protractor.ExpectedConditions; 
    var waitTimeout = 30000; 

    function logIn() { 
    loginPage.setUser('user'); 
    loginPage.setPassword('password'); 
    loginPage.login(); 
    } 

    var clickOn = function (element) { 
    browser.wait(EC.visibilityOf(element), waitTimeout).then(function() { 
     element.click(); 
    }); 
    }; 

    beforeEach(function() { 
    browser.ignoreSynchronization = true; 
    loginPage = new LoginPage(); 
    browser.wait(EC.presenceOf(loginPage.userLogin), waitTimeout); 
    logIn(); 
    var welcomePage = new WelcomePage; 
    clickOn(welcomePage.usersButton); 
    }); 

    afterEach(function() { 
    var welcomePage = new WelcomePage(); 
    welcomePage.loginButton.click(); 
    welcomePage.logoutButton.click(); 
    }); 

    it('verifies counter on active tab', function() { 
    var usersPage = new UsersPage(); 
    browser.wait(EC.visibilityOf(usersPage.firstRow), waitTimeout); 
    usersPage.rowsCount.count().then(function (count) { 
     expect(usersPage.activeTab.getText()).toContain('Active' + ' (' + count + ')'); 
    }); 
    }); 

誰でも、どのように対処するか回避する方法を妥当な解決策を提供してください、なぜそれが発生するのか説明できますか?

答えて

6

私は、すべての非同期コードがthat.For例の前に実行されることを保証しますitブロックでのコールバック関数を持つことをお勧めしたい:あなたは約束を返した場合

it('verifies counter on active tab', function (done) { 
    var usersPage = new UsersPage(); 
    browser.wait(EC.visibilityOf(usersPage.firstRow), waitTimeout); 

    usersPage.rowsCount.count() 
    .then(function (count) { 
     var text = usersPage.activeTab.getText(); 
     expect(text).toContain('Active' + ' (' + count + ')'); 
     done(); 
    }); 
}); 
+0

感謝を追加し、あなたはそれが私のコードで見るつもりですどのように書いてくださいだろうか? – Michal

+0

@Michal私の答えを変更しました。 –

+0

IIUCの 'done()'呼び出しは 'then()'関数の中になければなりません。 – Anton

2

実は、これは良い仕事でしょう。 テストで非同期作業を行っているので、コードの逐次的な期待から逸脱しています。 基本的に、あなたのコードブロックは実行され、その呼び出しを終了しますが、まだバックグラウンドで実行されている約束は参照されません。 それで、分度器は、それが完了するのを待つことができません(しかしそれはそれが待つ必要があることを知っています)ので、テストは失敗します。 代わりに行って()を実行するの手によって、ちょうど

return usersPage.rowsCount.count().then(function (count) { 
    expect(usersPage.activeTab.getText()).toContain('Active' + ' (' + count + ')'); 
}); 
関連する問題

 関連する問題