当我没有进行任何GitHub API调用时,GitHub API会抛出错误

时间:2015-07-30 01:52:42

标签: javascript angularjs unit-testing protractor github-api

我有一个用AngularJS编写的网站,我用Protractor进行了端到端的测试。在这个网站上,我有几个指向该网站的GitHub存储库的链接。我有几个端到端测试点击这些链接并验证它们是否会将您带到正确的页面。我还在每个测试结束时都有断言来验证没有抛出javascript错误。

有时,测试运行时,我会在测试结果中看到以下错误:

var begin = document.getElementById("begin");
begin.addEventListener("click", startPause, false);

function startPause(){
   if(begin == false){
      clearInterval(draw);
   }else{
      setInterval(draw, 10);
} 

这特别令人困惑,因为我根本没有对GitHub进行API调用 - 我只是在页面上放置了超链接供用户点击:

<failure type="toBe" message="Expected 'https://github.com/DnDGen/CharacterGen 0:0 Fetch API cannot load https://api.github.com/_private/browser/stats. ' to be ''."><![CDATA[Error: Failed expectation
    at app.assertNoErrors (C:\Users\Cid the Coatrack\Documents\Programming\Projects\DNDGenSite\Tests\Integration\Views\commonTestFunctions.js:17:47)
    at [object Object].promise.ControlFlow.runInFrame_ (C:\Users\Cid the Coatrack\Documents\Programming\Projects\DNDGenSite\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1877:20)
    at [object Object].promise.Callback_.goog.defineClass.notify (C:\Users\Cid the Coatrack\Documents\Programming\Projects\DNDGenSite\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:2464:25)
    at [object Object].promise.Promise.notify_ (C:\Users\Cid the Coatrack\Documents\Programming\Projects\DNDGenSite\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:563:12)
    at Array.forEach (native)
    at Object.goog.array.forEach (C:\Users\Cid the Coatrack\Documents\Programming\Projects\DNDGenSite\node_modules\protractor\node_modules\selenium-webdriver\lib\goog\array\array.js:203:43)
    at [object Object].promise.Promise.notifyAll_ (C:\Users\Cid the Coatrack\Documents\Programming\Projects\DNDGenSite\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:552:16)
    at goog.async.run.processWorkQueue (C:\Users\Cid the Coatrack\Documents\Programming\Projects\DNDGenSite\node_modules\protractor\node_modules\selenium-webdriver\lib\goog\async\run.js:125:21)
    at runMicrotasksCallback (node.js:337:7)]]>
</failure>

更奇怪的是,失败的测试并不一致。有时,所有测试都会通过。其他时候,几次测试都会失败。失败的测试与这些链接无关 - 有时测试断言品牌在导航栏中显示,与链接没有任何关系或引用,将因同一API原因而失败。

我还没有在the live site上看到此错误。我想知道是什么原因导致偶尔发生这种情况以及如何解决它。

更新

以下是我用来断言没有错误的代码:

<ul class="nav navbar-nav navbar-right">
    <li class="dropdown">
        <a id="collapsedGithubLinks" href="#" class="dropdown-toggle" data-toggle="dropdown">GitHub <span class="caret"></span></a>
        <ul class="dropdown-menu" role="menu">
            <li><a id="githubOrganizationLink" href="https://github.com/DnDGen">The DnDGen Project</a></li>
            <li class="divider"></li>
            <li><a id="githubDiceLink" href="https://github.com/DnDGen/RollGen">RollGen</a></li>
            <li><a id="githubEquipmentLink" href="https://github.com/DnDGen/TreasureGen">TreasureGen</a></li>
            <li><a id="githubCharacterLink" href="https://github.com/DnDGen/CharacterGen">CharacterGen</a></li>
            <li><a id="githubEncounterLink" href="https://github.com/DnDGen/EncounterGen">EncounterGen</a></li>
            <li><a id="githubDungeonLink" href="https://github.com/DnDGen/DungeonGen">DungeonGen</a></li>
            <li><a id="githubSiteLink" href="https://github.com/DnDGen/DNDGenSite">This Site</a></li>
        </ul>
    </li>
    <li class="padding-right"><a id="officialDndLink" href="http://dnd.wizards.com/">Official D&D Site</a></li>
</ul>

这是这样称呼的:

function assertNoErrors(browserLog) {
    for (var i = 0; i < browserLog.length; i++)
        expect(browserLog[i].message).toBe('');

    expect(browserLog.length).toBe(0);
}

更新2:

我还应该澄清,在我的网站之外导航的任何测试(即点击GitHub链接的测试)都不会检查错误,因为我不希望测试因为我不写的页面上的错误而失败和控制。失败的测试完全保留在我的Web应用程序内部,几乎从不与github链接进行交互。

以下是其中一个随机失败的测试示例(并非总是这一个,也不会一直失败)

afterEach(function () {
    browser.manage().logs().get('browser').then(assertNoErrors);
});

作为参考,这是该对象的HTML

it('shows the brand', function () {
    expect(element(by.css('.navbar-brand')).isDisplayed()).toBeTruthy();
});

1 个答案:

答案 0 :(得分:0)

这是一个有点教育的猜测,但是如果你点击链接并导航到github,并且你自己的代码没有调用https://api.github.com/_private/browser/stats,这些错误可能来自github页面,而不是你自己。

不幸的是,我没有一个优雅的解决方案来过滤这些问题。您无法断言在与第三方站点交互的测试中控制台中没有错误。