2015-08-16 7 views
4

Я пишу мокко тесты против магазина Reflux, чтобы проверить, что действие вызывает изменение состояния в хранилище. Сокращенная версия кода приводится ниже:Изменение состояния теста хранилища reflux с помощью mocha

магазин:

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 по-прежнему является ложным.

Выполнение console.log в методе onFooAction, я проверил, что метод фактически инициирован, и this.foo становится переключенным.

Есть ли что-то фундаментальное, что я здесь отсутствует: концептуально или иначе? Я искренне надеюсь, что это не вопрос времени!

ответ

5

Действия выдают события, в которые слушают магазины. В основном, ваш тест работает слишком быстро.

Как правило, в моих тестах я полагаю, что Reflux будет делать то, что он делает правильно, и я вызываю функцию слушателя напрямую. Вы хотите добавить еще несколько утверждений, чтобы убедиться, что 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); 
});