2017-01-01 98 views
1

我正在寫一些expect.js匹配器,我想測試自己的匹配器。所以我想寫正面和負面的測試。假設我寫了測試擴展到expect.js

toContainItem(name); 

這樣使用;

expect(femaleNames).toContainItem('Brad'); // test fails 
expect(femaleNames).toContainItem('Angelina'); // test passes 

我想要做的是寫一個測試爲負的情況下,像這樣;

it('should fail if the item is not in the list', function() { 
    expect(function() { 
     expect(femaleNames).toContainItem('Brad'); 
    }).toFailTest('Could not find "Brad" in the array'); 
}); 

我不知道如何在一個環境中,它不會失敗的含試運行失敗我測試代碼。這可能嗎?


編輯:基於卡爾Manaster的答案,我想出了一個擴展期望,允許上面的代碼工作;

expect.extend({ 
    toFailTest(msg) { 
     let failed = false; 
     let actualMessage = ""; 
     try 
     { 
      this.actual(); 
     } 
     catch(ex) 
     { 
      actualMessage = ex.message; 
      failed = true; 
     } 

     expect.assert(failed, 'function should have failed exception'); 

     if(msg) { 
      expect.assert(actualMessage === msg, `failed test: expected "${msg}" but was "${actualMessage}"`); 
     } 
    } 
}); 

回答

1

我想你可以包裝內期望在一個try/catch塊,在那裏你的catch子句中清除故障變量,然後做出關於變量的值,您的實際斷言。

let failed = true; 
try { 
    expect(femaleNames).toContainItem('Brad'); 
} catch (e) { 
    failed = false; 
} 
expected(failed).toBe(false); 
+1

感謝卡爾 - 會放棄它!不知道它通過例外工作。 –

+1

卡爾 - 謝謝你。這是我提出的解決方案的核心,現在編輯回我的問題。我所做的所有事情都是把它包裝起來,這樣你就可以編寫'expect(fn).toFailTest(expectedErrorMessage)' –