Войти с помощью github
Форум /

Запутался с асинхронным тестированием.

Делаю что-то вроде:

modules.define('spec', [ 'box', 'i-bem-dom', 'jquery', 'BEMHTML', 'events', 'sinon', 'chai' ],
  function(provide, Box, BEMDOM, $, BEMHTML, events, sinon, chai) {
    var expect = chai.expect;
    describe('box', function() {
        describe('vertical layout', function() {
            var box, emitter;
            beforeEach(function() {
                var
                    testLayout = { block : 'box', id : 'box',
                        // ...
                    },
                    html = BEMHTML.apply(testLayout),
                    dom = $(html).appendTo('body')
                ;
                box = BEMDOM.init(dom).bem(Box);
                emitter = box._events();
            });
            afterEach(function() {
                BEMDOM.destruct(box.domElem);
            });
            it('events', function(done) {
                this.timeout(3000);
                emitter.on('updatedOnInit', function(data){
                    console.log('updatedOnInit called');
                    // expect(true).toBe(true);
                    done();
                });
            });
        });
    });
    provide();
  }
);

В консоли вижу:

  1) box vertical layout events:
     timeout of 3000ms exceeded. Ensure the done() callback is being called in this test.

Причём, судя по всему, мой код начинает отрабатываться только после того, как тест завершает ожидание (по логам, по крайней мере, выходит так -- если они не кэшируются, конечно... Это возможно вооще?)

Что-то упустил?

+Вопрос вдогонку: как с помощью enb make specs ("enb-bem-specs": "^0.11.0") запускать не все, а отдельные тесты? Принимается что-то с командной строки?

UPD Разобрался (с помощью такой-то матери):

(1) Традиционная история с событями: подписка происходит после выкидывания события. Поменял на промисы. Сейчас всё тестируется в таком виде (фрагмент):

        it('initPromise result status should be equal updateChildSizes:done', function(done){
            box.initPromise
                .then(function(result){
                    result.status.should.be.equal('updateChildSizes:done');
                    done();
                })
                .fail(done)
            ;
        });

(2) Запуск отдельных тестов вполне логично оказался возможен с командой вида enb make specs blocks.specs/box.

(3) toBe вообще вытащил откуда-то из Jasmine. Это уже когда совсем перестал соображать, что происходит.

Темы закрываю, прошу прощения за спам.