2015-06-29 3 views
0

Я запускаю некоторые асинхронные тесты с Mocha, но некоторые будущие тесты не могут быть выполнены до тех пор, пока предыдущие не будут завершены. Для этого, я могу просто использовать done() обратного вызова для запуска их синхронно:Mocha запускает асинхронные тесты параллельно с done() callback

describe('first operations', function() { 
    it('should do something', function(done) { 
     longOperation(function(err) { 
      done(); 
     }); 
    }); 
    it('should do something', function(done) { 
     longOperation(function(err) { 
      done(); 
     }); 
    }); 
}); 

describe('second operations', function() { 
    it('should do something', function(done) { 
     longOperation(function(err) { 
      done(); 
     }); 
    }); 
    it('should do something', function(done) { 
     longOperation(function(err) { 
      done(); 
     }); 
    }); 
}); 

Это правда, замедляет всю работу, потому что я застрял работает каждый it() блок синхронно. Я хотел бы выполнить внутренние тесты асинхронно, и каждый из них описывает блок синхронно, но обратный вызов done() не работает таким образом (по крайней мере, используя async).

Я делаю что-то неправильно или это просто не поддерживается? Если нет, есть ли способ, которым я могу обойти это, чтобы достичь своей цели?

describe('first operations', function(done) { 
    async.parallel([ 
     function(callback) { 
      it('should do something', function() { 
       longOperation(function(err) { 
        callback(); 
       }); 
      }); 
     }, 
     function(callback) { 
      it('should do something', function() { 
       longOperation(function(err) { 
        callback(); 
       }); 
      }); 
     } 
    ], function(err) { 
     done(); 
    }); 
}); 

describe('second operations', function(done) { 
    async.parallel([ 
     function(callback) { 
      it('should do something', function() { 
       longOperation(function(err) { 
        callback(); 
       }); 
      }); 
     }, 
     function(callback) { 
      it('should do something', function() { 
       longOperation(function(err) { 
        callback(); 
       }); 
      }); 
     } 
    ], function(err) { 
     done(); 
    }); 
}); 
+1

Возможный дубликат [Отключение мокко описывается параллельно] (http://stackoverflow.com/questions/28641646/kicking-off-mocha-describes-in-parallel) – Louis

+0

Согласовано. Не знаю, как я этого не видел. – brandonscript

ответ

1

context.describe(), кажется, не быть экземпляром Runnable. context.it(), с другой стороны, похоже, создает экземпляр Runnable. Похоже, что только экземпляры Runnablereceive a callback.

Нет, похоже, вы не можете запускать describe() блоки серийно во время работы. it() блокирует асинхронно.

+0

Hrm, действительно. Мне нужно сделать рытье, чтобы понять, как я могу заставить это работать. – brandonscript

+0

Я не уверен, что правильно понимаю преимущество в производительности, которое вы намереваетесь получить, делая это. Предположительно, mocha собирается занять такое же количество времени, прежде чем он вернет код выхода в вызывающую оболочку независимо от того, хотите ли вы запускать функции или пакеты синхронно. –

+0

Мне нужно иметь возможность масштабировать это, чтобы параллельно запускать несколько отдельных тестов. В первом пакете я получаю записи из базы данных. Во втором пакете я удаляю записи. Я не могу проверить ожидаемые/известные записи, если они удалены. – brandonscript

2

mocha-parallel-tests похоже, был создан для заполнения этой потребности. Ниже приведено описание с сайта проекта:

Обычно тесты, написанные с мокко, запускаются последовательно. Это происходит потому, что каждый набор тестов не должен зависеть от другого. Но если вы выполняете тесты, которые занимают много времени (например, тесты с Selenium Webdriver), ожидающих так много времени, невозможно.

Я считаю, что это проведет все тесты параллельно. Чтобы ограничить описанные блоки для последовательного запуска, вы можете поместить их в отдельные файлы, а затем запустите mocha-parallel-tests отдельно в этих файлах.

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