2015-08-16 66 views
4

我正在對Reflux商店進行摩卡測試,以驗證某個操作是否會導致商店內的狀態發生變化。摩卡迴流商店的測試狀態變化

商店:代碼的縮小版下面給出

var AppStore = Reflux.createStore({ 
    init: function() { 
    this.foo = false; 
    }, 
    listenables: [AppActions], 
    onFooAction: function() { 
    this.foo = !this.foo; 
    this.trigger({action: "foo-ed"}); 
    }; 
}); 

操作:

var AppActions = Reflux.createActions([ 
    "fooAction" 
]); 

測試:

it("toggles foo", function() { 
    expect(AppStore.foo).to.equal(false); 

    AppStore.listenables[0].fooAction(); 

    expect(AppStore.foo).to.equal(true); 
}); 

然而,第二個斷言(expect(AppStore.foo).to.equal(true);)沒有說foo仍然是錯誤的。

通過在onFooAction方法內執行console.log,我已驗證該方法實際上已觸發,並且this.foo正在切換。

有沒有什麼基本的東西我在這裏失蹤:在概念上還是其他方面?我衷心希望這不是時機問題!

回答

5

動作發出商店收聽的事件。基本上,你的測試運行得太快了。

通常,在我的測試中,我認爲Reflux會做它正確的工作,並且我直接調用偵聽器函數。你想添加幾個斷言來確保迴流連接正確。

it("is configured", function() { 
    expect(AppStore.listenables).to.include(AppActions); 
    expect(AppActions.fooAction).to.be.a('function'); 
}); 

it("toggles foo", function() { 
    expect(AppStore.foo).to.equal(false); 

    AppStore.onFooAction(); 

    expect(AppStore.foo).to.equal(true); 
}); 

另一種可以測試的方法是超時,但當我在測試中放置超時時,我覺得很髒。

it("toggles foo", function (done) { 
    expect(AppStore.foo).to.equal(false); 

    AppStore.listenables[0].fooAction(); 

    setTimeout(function() { 
    try { 
     expect(AppStore.foo).to.equal(true); 
     done(); 
    } catch (e) { 
     done(e); 
    } 
    }, 15); 
});