2017-10-12 68 views
0
class TestObject { 
    constructor(value) { 
    if (value === null || value === undefined) { 
     throw new Error('Expect a value!'); 
    } 
    } 
} 

describe('test the constructor',() => { 
    test('it works',() => { 
    expect(() => { 
     new TestObject(); 
    }).toThrow(); 
    }); 

    test('not work',() => { 
    expect(new TestObject()).toThrow(); 
    }); 
}); 

2測試用例在這裏,一個工作,另一個不工作。當在構造函數中直接創建ES6類的實例時,爲什麼Jest的toThrow不起作用?

發生故障的消息爲not work一個是以下幾點:

●測試構造>不行

期待值!

at new TestObject (tests/client/utils/aaa.test.js:4:11) 
at Object.<anonymous> (tests/client/utils/aaa.test.js:17:12) 
    at Promise (<anonymous>) 
    at <anonymous> 
at process._tickCallback (internal/process/next_tick.js:188:7) 

爲什麼我需要來包裝調用函數調用,我們並不需要包裝時該函數只返回一個普通值,甚至是一個承諾,我們可以使用async/await檢查在expect()而不是在expect()內創建一個函數。

這裏發生了什麼事?

回答

1

這裏

expect(new TestObject()).toThrow(); 

new TestObject()計算第一,然後expect(...),然後...toThrow(),按照operator precedence。當new TestObject()拋出時,其他任何東西都無關緊要。

這就是爲什麼toThrow預計將拋出一個功能:

expect(() => { 
    new TestObject(); 
}).toThrow(); 

這樣可以try..catch在內部被稱爲當包裹。

它在茉莉花toThrow和Chai to.throw聲明中的作用類似。

相關問題