2013-12-23 3 views
4

Я тестирую хранимые процедуры с использованием mocha в экземпляре nodejs. У меня есть этот скелет теста:Не удается запустить Mocha.js в синхронном режиме

var chai    = require('chai'), 
    MyReporter  = require("../MyReporter.js"), 
    chokidar   = require('chokidar'), 
    expect   = chai.expect, 
    should   = chai.should, 
    assert   = chai.assert; 

var Mocha = require('mocha'); 
amochai = new Mocha({ 
    bail: false, 
    debug: true 
}); 

amochai.addFile("mytest_v1.js"); 

function runMocha(callback) { 
    amochai.run(function() { 
    callback(); 
    }); 
} 

watcher.on('change', function(path, stats) { 
     runMocha(function() {}); 
} 

Проблема: Мои тесты всегда работают в асинхронном режиме, хотя все мои тесты написаны так:

describe('Mysql stored procedures', function(){ 
    describe('Add this data', function(){ 
     it('-- Should return this information', function(){ 
     // asserts 
     }); 
    }); 
}); 

Там не сделано() обратного вызова , Я не имею в виду нигде, поэтому, поскольку везде упоминается, что mocha.js по умолчанию синхронно, что может быть причиной того, что мой код работает в асинхронном режиме?

PATCH

Чтобы исправить мою проблему, я должен был использовать ранее() и проверить мои тесты состояния, но это становится кошмаром для поддержания.

+0

Каков симптом, который приводит вас к выводу, что мокка выполняет асинхронные тесты? – Louis

+0

Я запускаю те тесты в узле-инспекторе, и я могу подтвердить, что через контрольные точки тесты проходят параллельно. Я привел отладчика на помощь, чтобы узнать, почему мои тесты были некогерентными. – Alain

+0

Как вы можете синхронно вызвать хранимые процедуры? вы говорите о процедурах хранения db, правильно? – vkurchatkin

ответ

12

Выполняются операции, которые являются асинхронными в ваших синхронных тестах мокки.

Говорить тест мокки «синхронно» неоднозначно. Это может означать:

  • Операция, протестированная при проведении теста, происходит синхронно.
  • Mocha обрабатывает тест синхронно.

Эти два варианта не являются эквивалентными. Одно не влечет за собой другого. По умолчанию Mocha обрабатывает все тесты синхронно. Мы можем заставить его обрабатывать тест асинхронно, но добавляя параметр к обратному вызову, который мы передаем в it (или его эквивалент в других тестовых интерфейсах). (Позже версии мокко в конце концов добавили еще один способ сделать мокко обрабатывать тест асинхронно:. Вернуть обещание Но я собираюсь использовать обратные вызовы для следующих примеров.) Таким образом, мы можем иметь 4 комбинации синхронности:

  • Операция синхронная, Mocha тест синхронный.

    it("reads foo", function() { 
        fs.readFileSync("foo"); 
        // ssert what we want to assert. 
    }); 
    

    Нет проблем.

  • Операция синхронная, проверка мокки асинхронная.

    it("reads foo", function (done) { 
        fs.readFileSync("foo"); 
        // Assert what we want to assert. 
        done(); 
    }); 
    

    Бесполезно, чтобы тест Mocha был асинхронным, но проблем не было.

  • Эксплуатация асинхронная, Mocha test асинхронная.

    it("reads foo", function (done) { 
        fs.readFile("foo", function() { 
         // Assert what we want to assert. 
         done(); 
        }); 
    }); 
    

    Нет проблем.

  • Эксплуатация асинхронная, Mocha test synchronous.

    it("reads foo", function() { 
        fs.readFile("foo", function() { 
         // Assert what we want to assert. 
        }); 
    }); 
    

    Это проблема. Mocha вернется сразу же после тестового обратного вызова и назовет его успешным (при условии, что fs.readFile не повышает уровень исполнения). Асинхронная операция будет по-прежнему планироваться, а вызов еще может быть вызван позже.Один важный момент здесь: Mocha не имеет возможности делать операции, которые он испытывает синхронно. Поэтому изготовление теста Mocha синхронно не влияет на операции в тесте. Если они асинхронны, они останутся асинхронными, независимо от того, что мы скажем Mocha.

Этот последний случай в вашей системе приведет к тому, что выполнение хранимых процедур будет поставлено в очередь с системой БД. Если это очередность происходит без ошибок, Mocha сразу заканчивается. Затем, если есть изменение файла, ваш наблюдатель запускает другой запуск Mocha и больше операций ставится в очередь и т. Д.

+0

Вы, вероятно, определяете мое замешательство и четко объясняете поведение, которое я экспериментирую. Это имеет смысл: у меня есть асинхронные вызовы (вызов модуля mysql nodejs), протестированные в синхронном режиме запуска mocha. Я просто удивлен тем, что Mocha не «отчасти» ждет определенного обратного вызова от тестера, чтобы устранить эту двусмысленность от ответственности тестировщика. – Alain

+0

Привет @Louis, Каково было бы ваше предложение о том, как обращаться с четвертым примером? –

+0

@Mageshkhanna Вам необходимо преобразовать его в 1-й или 3-й случаи. В коде, который я показываю в качестве примера, это означает использование 'fs.readFileSync' (1-й случай) или функция передана' it' принимает аргумент 'done' и вызывает его в случае обратного вызова (3-го). – Louis

Смежные вопросы