2017-08-25 68 views
3

我有一個使用mocha和chai創建的單元測試測試用例,我將深度比較value對象數組與JSON文件的解析內容。如何讓mocha在斷言錯誤中顯示整個對象?

我的記錄對象有大約20個屬性,目前只有價格可能會導致不匹配。在差異上,我只看到其中五個。

expect(records).to.deep.equal(expected); 

     "data": { 
    -  "price": 3578 
    +  "price": 3438 
     "not_important": "foo" 
     "also_not_important": "bar" 
     } 
     "data": { 
    -  "price": 1828 
    +  "price": 1698 
     "not_important": "foo" 
     "also_not_important": "bar" 
     } 

這是在大多數情況下有用的默認,但在這一次它混淆了哪些具體數據對象被打破斷言,因爲我只看到冗餘數據在這裏。

假設有在數據對象的important屬性,將使其很清楚什麼期望是打破了測試。因此,我希望能夠配置顯示的屬性或在diff中顯示整個對象。

如何配置摩卡的差異顯示?


這裏是一個人爲的元語法示例展示了此問題:

import {expect} from "chai"; 

describe(("diff problem"),() => { 
    it("should show case that the diff is not shown properly",() => { 
     const actual = { 
      a: 1, 
      troiz: 0, 
      bar: 0, 
      baz: 2, 
      poit: 3, 
      narf: 4, 
      fizzbuzz: 117, 
      fizz: 5, 
      buzz: 4, 
      waldo: 115, 
      mos: 85465, 
      important: "THIS IS IMPORTANT", 
     }; 

     const expected = { 
      ...actual, 
      a: 0, 
     }; 

     return expect(actual).to.deep.equal(expected); 
    }); 
}); 

該測試用例的輸出將是:

2)SourceParser差異問題應顯示上的錯誤整個DIFF一個屬性:

AssertionError: expected { Object (a, troiz, ...) } to deeply equal { Object (a, troiz, ...) } 
    + expected - actual 

    { 
    - "a": 1 
    + "a": 0 
    "bar": 0 
    "baz": 2 
    "buzz": 4 
    "fizz": 5 

然而,它將有助於看到:important: "THIS IS IMPORTANT"也是如此。


這裏是用於陣列情況下的變形例:

describe(("diff problem with an array"),() => { 
    it("should show case that the diff is not shown properly for deep equal of arrays",() => { 
     const anEntity = { 
      a: 1, 
      troiz: 0, 
      bar: 0, 
      baz: 2, 
      poit: 3, 
      narf: 4, 
      fizzbuzz: 117, 
      fizz: 5, 
      buzz: 4, 
      waldo: 115, 
      mos: 85465, 
      important: "IMPORTANT", // assume that each item has a unique important property, which is why it's helpful for it to be shown 
     }; 

     const offendingItem = { 
      ...anEntity, 
      a: 0, 
     }; 

     const actual = [ 
      anEntity, 
      offendingItem, 
      anEntity, 
     ]; 

     const expected = [ 
      anEntity, 
      anEntity, 
      anEntity, 
     ]; 

     return expect(actual).to.deep.equal(expected); 
    }); 

的輸出將是:

AssertionError: expected [ Array(3) ] to deeply equal [ Array(3) ] 
    + expected - actual 

     "troiz": 0 
     "waldo": 115 
    } 
    { 
    - "a": 0 
    + "a": 1 
     "bar": 0 
     "baz": 2 
     "buzz": 4 
     "fizz": 5 

,它不會得到更好地與路易斯的答案改性如柴它僅轉儲整個實際陣列的第一,然後示出了非有用DIFF:

AssertionError: expected [ { a: 1, 
    troiz: 0, 
    bar: 0, 
    baz: 2, 
    poit: 3, 
    narf: 4, 
    fizzbuzz: 117, 
    fizz: 5, 
    buzz: 4, 
    waldo: 115, 
    mos: 85465, 
    important: 'IMPORTANT' }, 
    { a: 0, 
    troiz: 0, 
    bar: 0, 
    baz: 2, 
    poit: 3, 
    narf: 4, 
    fizzbuzz: 117, 
    fizz: 5, 
    buzz: 4, 
    waldo: 115, 
    mos: 85465, 
    important: 'IMPORTANT' }, 
    { a: 1, 
    troiz: 0, 
    bar: 0, 
    baz: 2, 
    poit: 3, 
    narf: 4, 
    fizzbuzz: 117, 
    fizz: 5, 
    buzz: 4, 
    waldo: 115, 
    mos: 85465, 
    important: 'IMPORTANT' } ] to deeply equal [ { a: 1, 
    troiz: 0, 
    bar: 0, 
    baz: 2, 
    poit: 3, 
    narf: 4, 
    fizzbuzz: 117, 
    fizz: 5, 
    buzz: 4, 
    waldo: 115, 
    mos: 85465, 
    important: 'IMPORTANT' }, 
    { a: 1, 
    troiz: 0, 
    bar: 0, 
    baz: 2, 
    poit: 3, 
    narf: 4, 
    fizzbuzz: 117, 
    fizz: 5, 
    buzz: 4, 
    waldo: 115, 
    mos: 85465, 
    important: 'IMPORTANT' }, 
    { a: 1, 
    troiz: 0, 
    bar: 0, 
    baz: 2, 
    poit: 3, 
    narf: 4, 
    fizzbuzz: 117, 
    fizz: 5, 
    buzz: 4, 
    waldo: 115, 
    mos: 85465, 
    important: 'IMPORTANT' } ] 
     + expected - actual 

      "troiz": 0 
      "waldo": 115 
     } 
     { 
     - "a": 0 
     + "a": 1 
      "bar": 0 
      "baz": 2 
      "buzz": 4 
      "fizz": 5 
+0

@Louis它應該沒關係,雖然[柴顯然沒有照顧差異](https://github.com/chaijs/chai/issues/469#issuecomment-153759558) – k0pernikus

回答

2

據我所知,沒有內置的方式來獲得柴或摩卡產生差異列表,將添加到由DIFF提供的上下文某些字段不在負責的測試失敗。而且我不知道任何擴展程序會完全符合您的要求。所以我只知道解決方法。


如果設置truncateThreshold配置設置爲較大的值,或0,如果你不希望任何截斷,在出現前的差異將顯示整個對象的失敗消息。所以,如果我添加到您的代碼:

chai.config.truncateThreshold = 0; // 0 means "don't truncate, ever". 

(配置選項都覆蓋在這個documentation page。)

然後我得到的錯誤是:

 AssertionError: expected { a: 1, 
    troiz: 0, 
    bar: 0, 
    baz: 2, 
    poit: 3, 
    narf: 4, 
    fizzbuzz: 117, 
    fizz: 5, 
    buzz: 4, 
    waldo: 115, 
    mos: 85465, 
    important: 'THIS IS IMPORTANT' } to deeply equal { a: 0, 
    troiz: 0, 
    bar: 0, 
    baz: 2, 
    poit: 3, 
    narf: 4, 
    fizzbuzz: 117, 
    fizz: 5, 
    buzz: 4, 
    waldo: 115, 
    mos: 85465, 
    important: 'THIS IS IMPORTANT' } 
     + expected - actual 

     { 
     - "a": 1 
     + "a": 0 
     "bar": 0 
     "baz": 2 
     "buzz": 4 
     "fizz": 5 

此外,一種方式來獲得錯誤消息的自定義信息是設置的自定義消息和斷言,比如:

expect(actual).to.deep.equal(
      expected, 
      `failed equality test on object with important field set to: ${actual.important}`) 

自定義消息可以像您需要的那樣冗長或簡潔。

如果只有一個對您而言很重要的區域用於區分對象,則自定義消息可能足以獲取跟蹤問題所需的信息。


對於對象的陣列,則可以通過經由actualexpected陣列迭代和每個成員進行比較執行比較。它將基本上像上面描述的那樣工作。當然,這有缺點:例如,如果第1項和第10項不同,則只會得到第1項的報告,因爲測試將以比較失敗結束。當你解決這個問題並再次運行測試時,你會得到一個項目10的報告。無論在實踐中這是一個主要問題取決於你正在測試的數據類型。


有一件事我一直在默認比較算法沒有做我想要的東西的情況下做的是導入我配置我喜歡的一個版本比較庫,然後使用該庫對象之間進行的diff那我關心並將結果合併成最終報告,然後用斷言進行檢查。

再說一遍,我不知道一個庫,它會做特別是你在找什麼。不過,我可以想象通過actualexpected數組迭代產生一個差異報告,然後將它們組合成包含識別信息的較大報告。

+0

我在想一個自定義消息,然後問題是我深深地比較了兩個數據對象的數組。 – k0pernikus

+0

而'truncateThreshold'也不是一個有用的設置,因爲這隻會輸出整個實際的數組。它不會影響差異。我將修改陣列問題的示例。 – k0pernikus

+0

這個答案不解決數組比較的情況。絕對值得讚揚:) – k0pernikus