2017-08-18 189 views
7

我有一個非常基本的業力/茉莉花設置與一個測試套件包含兩個測試。我期望第一次測試失敗,第二次測試通過。一個失敗的測試導致其他異步測試失敗

describe("The system", function() { 

    it("should fail", function() { 
     expect(true).toBe(false); 
    }); 

    it("should succeed", function(done) { 
     setTimeout(function() { 
      expect(1).toBe(1); 
      done(); 
     }, 10); 
    }); 
}); 

然而,當我運行在瀏覽器中這些測試,並單擊調試按鈕打開噶DEBUG RUNNER,我看到這兩個測試失敗,在第二次測試失敗,並第一的錯誤信息測試。正常的測試運行(即不在Karma DEBUG RUNNER中)按預期工作。

用於第二測試的錯誤信息是:

Uncaught Expected true to be false. 
    at UserContext.<anonymous> (http://localhost:9876/base/workingspec.js:4:22) thrown 

當我禁用或刪除第一測試中,第二測試通過。

爲什麼兩種測試在這種情況下都失敗?爲什麼第二次測試會因第一次測試的錯誤信息而失敗?


我的測試設置包含以下包/版本:

+-- [email protected] 
+-- [email protected] 
+-- [email protected] 
+-- [email protected] 
`-- [email protected] 
+0

我遇到了類似的問題。我不知何故覺得這是一個在業力 - 茉莉花 - html - 記者模塊中的問題。但我沒有確鑿的證據證明這一點。 –

+0

這是在這裏工作:https://jsfiddle.net/DerekL/s5hzsh40/ –

+0

@MaazSyedAdeeb這也是我的理論之一,但事實並非如此。如果我使用標準的'progress'記者,Chrome的調試控制檯會顯示相同的錯誤。 – Daan

回答

1

問題確實存在於Karma Debug Runner的Debug.js文件中,因爲@user907860已經暗示。茉莉花並不特別。我有reported the issuecreated a fix剛剛合併到Karma的主分支,所以下一個版本應該可以解決這個問題。

1

起初我還以爲這是一個錯誤,但一些研究的輝煌鉻devtools後,似乎這是一個預期行爲,至少由茉莉花。但它可能是Karma框架中的一個錯誤。如果你對此有何評論了罰球線,並重新啓動善緣服務器

for (var i = 0; i < result.log.length; i++) { 
    // Throwing error without losing stack trace 
    (function (err) { 
    setTimeout(function() { 
     throw err 
    }) 
    })(result.log[i]) 
} 

總之,node_modules/karma/static/debug.js文件(這是JS文件的調試頁)有這幾行(我有Karma v1.7.0) ,你會看到只有控制檯日誌消息,這應該是預期的:首先FAIL,然後是PASS,然後是總結。


很可能,Karma中的錯誤可能是在每個規範之後報告的行爲。

這就是在這裏發生的事情一步一步(我有版本"jasmine-core": "^2.6.4",至少這是我package.json文件):

  1. 茉莉花運行的第一個規範和失敗;
  2. Karma在日誌中報告了這一點,並添加了一個函數,該函數向堆棧拋出一個錯誤(我假設讀者知道JavaScript中的異步模型,如果不是,那麼他必須閱讀關於這個的東西,如 「Effective JavaScript:68種具體方法來駕馭JavaScript的力量「,David Herman,一本真正的寶石書或其他地方)。此外,這一點很重要,儘管我不確定,因爲我沒有深入研究代碼,它註冊了一些「globalError」,因爲在下一步
  3. Jasmine運行第二個規範,並調用getJasmineRequireObj().GlobalErrors函數(jasmine.js:2204)。檢測到「globalError」,規範立即成爲失敗。異步期望在Karma的函數後添加到堆棧中,其中一個拋出錯誤
  4. 然後第一個函數(拋出錯誤)開始執行,將其添加拋出。此功能將始終茉莉花異步規範之前被調用,因爲在debug.js沒有及時傳遞給setTimeout電話:

    //notice the absent time argument setTimeout(function() { throw err })

  5. 茉莉花運行assync從第二規格期待,並將其傳遞

  6. 噶在第二規格爲失敗報告,並將該錯誤投擲(如果沒有註釋,則沒有發生錯誤,該規範傳遞)到堆棧
  7. 噶的第二錯誤被拋出

下面是屏幕截圖與數字,由我提出來說明從列表中的步驟:

throwdebug.js文件沒有評論:

karma jasmine errors step by step

,並與評論throw

karma jasmine without throwing in the debug.js file