在整个mocha测试之前运行异步代码

时间:2015-09-03 03:59:57

标签: javascript node.js asynchronous promise mocha

我正在寻找一种在整个mocha测试之前运行异步代码的方法。

这是一个使用参数数组的测试示例&期望和循环遍历此数组中的所有项以生成函数断言。

var assert = require('assert')

/* global describe, it*/

var fn = function (value) {
  return value + ' ' + 'pancake'
}

var tests = [
  {
    'arg': 'kitty',
    'expect': 'kitty pancake'
  },
  {
    'arg': 'doggy',
    'expect': 'doggy pancake'
  },
]

describe('example', function () {
  tests.forEach(function (test) {
    it('should return ' + test.expect, function (){
      var value = fn(test.arg)
      assert.equal(value, test.expect)
    })
  })
})

现在,我的问题是,如果测试值来自一个承诺,这将是如何工作的,如下所示:

var assert = require('assert')
var Promise = require('bluebird')

/* global describe, it*/

var fn = function (value) {
  return value + ' ' + 'pancake'
}

function getTests () {
  return Promise.resolve('kitty pancake')
  .delay(500)
  .then(function (value) {
    return [
      {
        'arg': 'kitty',
        'expect': value
      },
      {
        'arg': 'doggy',
        'expect': 'doggy pancake'
      }
    ]
  })
}

getTests().then(function (tests) {
  describe('example', function () {
    tests.forEach(function (test) {
      it('should return ' + test.expect, function (){
        var value = fn(test.arg)
        assert.equal(value, test.expect)
      })
    })
  })  
})

也尝试过:

describe('example', function () {
  getTests().then(function (tests) {
    tests.forEach(function (test) {
      it('should return ' + test.expect, function (){
        var value = fn(test.arg)
        assert.equal(value, test.expect)
      })
    })
  })
})

但是在这个例子中没有一个测试运行,因为mocha没有识别出describe语句,因为它在一个promise中。

before / beforeEach无论如何都无法帮助进行格式化测试,除非这是一个beforeTest挂钩,可以为mocha提供知识&# 39;是一个需要在整个测试之前运行的异步操作。

4 个答案:

答案 0 :(得分:2)

作为Daniel Perez方法的替代方案,您还可以use the command line switch --delay and start the tests on the first run() call。通过异步延迟run(),您可以预先异步注册describeit。但请注意,您只能调用run()一次,即仅在一个测试文件中调用./test/。因此,我在./testAsync/中创建了一个异步测试运行器,并在// ./test/asyncRunner.js "use strict"; const allAsyncPaths = [ "test-featureA", "test-featureB", ].map(a => "../testAsync/" + a); const allAsyncTestFunctions = allAsyncPaths.map(require); Promise.resolve({ }).then(function() { const allPromises = allAsyncTestFunctions.map(a => a()); return Promise.all(allPromises); }).then(function() { run(); // mocha waits for run() because of --delay flag }).catch(function(err) { console.error(err); }); 中创建了每个异步测试:

// ./testAsync/test-featureA.js
"use strict";
function asyncTestRegistrator() {

  return Promise.resolve({
  }).then(function() {
    return getTestsAsync();
  }).then(function(tests) {

  describe('example', function () {
    tests.forEach(function (test) {
      it('should return ' + test.expect, function (){
        var value = fn(test.arg);
        assert.equal(value, test.expect);
      });
    });
  });
}
module.exports = asyncTestRegistrator;

<script>
$(document).ready(function () {
    //Submit form to add record.
    $('#addTechNotes').click(function (e) {          
        e.preventDefault();
        $.ajax({
            data: {
                tech_notes : $("#tech_notes").val(), 
                ticket_id : $("#ticket_id").val()
            },
            type:"POST",
            url:"../cfcs/add_ticket_notes.cfc?method=addNotes",
            success: function() {
                $("#addNotesMessage").append( "Note successfully entered." );
            }, // CLOSE THE SUCCESS PARAM
            // START THE ERROR PARAM
            error: function() {
                console.log("error");
            }
        });
    });
});
</script>

答案 1 :(得分:1)

我不确定是否有任何简单的方法可以执行此操作,但您可以尝试run Mocha programatically

这是一个有点脏的版本,看起来像是为了表明这个想法。

Html::a('<i class="glyphicon glyphicon-share-alt"></i>', false, ['id'=> 'replay-to-'. $model->ID_KOMENTAR ]);

data.js

var Promise = require('bluebird') module.exports.tests = [] function getTests () { return Promise.resolve('kitty pancake') .delay(500) .then(function (value) { module.exports.tests = [ { 'arg': 'kitty', 'expect': value }, { 'arg': 'doggy', 'expect': 'doggy pancake' } ] }) } module.exports.getTests = getTests

test-launcher.js

var Mocha = require('mocha'), fs = require('fs'), path = require('path') // First, you need to instantiate a Mocha instance. var mocha = new Mocha() // Then, you need to use the method "addFile" on the mocha // object for each file. // Here is an example: fs.readdirSync('test').filter(function(file){ // Only keep the .js files return file.substr(-3) === '.js' }).forEach(function(file){ // Use the method "addFile" to add the file to mocha mocha.addFile( path.join('test', file) ) }) // make sure your tests are loaded before running the tests require('./data').getTests().then(function () { // Now, you can run the tests. mocha.run(function(failures){ process.on('exit', function () { process.exit(failures) }) }) })

test/index.js

然后,您可以通过运行var assert = require('assert') var tests = require('../data').tests var fn = function (value) { return value + ' ' + 'pancake' } describe('test', function () { describe('example', function () { tests.forEach(function (test) { it('should return ' + test.expect, function (){ var value = fn(test.arg) assert.equal(value, test.expect) }) }) }) }) 来运行您的休息。

答案 2 :(得分:0)

我会使用as {/ await和delay option,如下所示:

setTimeout(async () => {
//get tests async
const tests = await getTests()

describe('example', async () => {

  tests.forEach((test) => {
   it(`test name: ${test.name} `, () => {
    console.log(test.name)
  })
 })
})

run()
}, 1000)

答案 3 :(得分:-1)

我会在it调用中移动异步逻辑。过于花哨的单元测试是代码味道,当他们不仅需要调试和修复失败的测试而且必须调试和修复甚至没有定义和运行的测试时,可能会激怒其他开发人员,因为花哨的设置代码有虫子。尽量不要去那里。

var assert = require('assert')
var Promise = require('bluebird')

/* global describe, it*/

var fn = function(value) {
  return value + ' ' + 'pancake'
}

function getTests() {
  return Promise.resolve('kitty pancake')
    .delay(500)
    .then(function(value) {
      return [
        {
          'arg': 'kitty',
          'expect': value
        },
        {
          'arg': 'doggy',
          'expect': 'doggy pancake'
        }
      ]
    })
}

describe('example', function() {
  it('should handle many things', function(done) {
    getTests().then(function(tests) {
      tests.forEach(function(test) {
        var value = fn(test.arg)
        assert.equal(value, test.expect, 'should return ' + test.expect)
      })
      done()
    })
  })
})