2015-11-17 61 views
1

例如,我有這樣一些基本的東西:當摩卡/柴測試異步功能的不匹配的期望總是導致超時

it.only('tests something', (done) => { 
    const result = store.dispatch(fetchSomething()); 
    result.then((data) => { 
    const shouldBe = 'hello'; 
    const current = store.something; 
    expect(current).to.equal(shouldBe); 
    done(); 
    } 
}); 

current不匹配shouldBe,而不是消息說他們不匹配,我得到通用超時消息:

Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

這就好像期望暫停腳本或其他東西。我該如何解決?這使得調試幾乎不可能。

+0

通常使用異步代碼,您可以將done()傳遞到您的回調函數中並在其中執行您的期望: 'store.getState().get('something',function(err,data){expect ...; done()}})' –

+0

除非,你正在返回一個承諾,否則第5行不會使用異步代碼。 –

+0

對不起,也許這是一個不好的例子,但異步部分是在result.then((數據)=> {'。getState()部分不是異步。 –

回答

2

的期望是不暫停腳本,它拋出一個異常,你打done回調之前,但因爲它不再是內部的測試方法的背景下它不會被測試套件要麼拿起,所以你從未完成測試。然後你的測試就會旋轉,直到達到超時。

您需要在回調或Promise的錯誤處理程序中的某個點捕獲異常。

it.only('tests something', (done) => { 
    const result = store.dispatch(fetchSomething()); 
    result.then((data) => { 
    const shouldBe = 'hello'; 
    const current = store.getState().get('something'); 
    try { 
     expect(current).to.equal(shouldBe); 
     done(); 
    } catch (e) { 
     done(e); 
    } 
    }); 
}); 

OR

it.only('tests something', (done) => { 
    const result = store.dispatch(fetchSomething()); 
    result.then((data) => { 
    const shouldBe = 'hello'; 
    const current = store.getState().get('something'); 
    expect(current).to.equal(shouldBe); 

    }) 
    .catch(done); 
}); 

編輯

如果你不反對引進其他圖書館,有一個相當不錯的庫調用chai-as-promised。這爲您提供了一些用於這種測試的好用工具。

+0

謝謝!所以柴的'expect'實際上在沒有匹配的情況下會拋出一個異常......現在我想到它是非常有意義的 –

+0

儘管如此,它在技術上是斷言功能,在這種情況下,「平等」,如果期望沒有得到滿足,通常會​​拋出。 – paulpdaniels

+0

是的,我的意思是,謝謝。 –