如何以编程方式和异步方式定义 Mocha 测试?

mck*_*oss 5 testing mocha.js node.js promise

我正在尝试将一些以编程方式生成的测试与 Node.js 中的 Mocha 测试框架集成。

\n\n
var Promise = require(\'promise\');\n\nvar resolved = Promise.resolve(true);\n\nsuite("Synchronously defined suite", function() {\n  test("Synchronously defined test", function() {\n    return resolved;\n  });\n});\n\ndefer(function() {\n  suite("Asynch DEFINED test", function() {\n    suiteSetup(function() {\n      console.log("Asynch setupSuite running...");\n    });\n\n    test("Asynch Test", function() {\n      console.log("Async test running...");\n      return resolved;\n    });\n  });\n});\n\nfunction defer(fn) {\n  console.log("Calling defer...");\n  setTimeout(fn, 100);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我执行这个时,我得到:

\n\n
$ mocha --ui tdd nested-test.js \nCalling defer...\n\n\n  Synchronously defined suite\n    \xe2\x9c\x93 Synchronously defined test\n\n\n  1 passing (4ms)\n
Run Code Online (Sandbox Code Playgroud)\n\n

似乎 Mocha 要求所有“套件”函数在模块加载时同步执行 - 延迟调用似乎被(默默地)忽略(或者程序在调用它们之前退出)。

\n

mck*_*oss 1

这就是我想出的办法。它不在 mocha 下运行,而是作为一个独立的节点程序运行:

\n\n
var Promise = require(\'promise\');\nvar Mocha = require(\'mocha\');\n\nvar resolved = Promise.resolve(true);\nvar rejected = Promise.reject(new Error("Failing test."));\n\ndefer(function() {\n  console.log("Programmatic test suite creation.");\n  var suite = new Mocha.Suite("Programatic Suite");\n  var runner = new Mocha.Runner(suite);\n  var reporter = new Mocha.reporters.Spec(runner);\n\n  suite.addTest(new Mocha.Test("My test", function() {\n    return resolved;\n  }));\n\n  suite.addTest(new Mocha.Test("My (failing) test", function() {\n    return rejected;\n  }));\n\n  runner.run();\n});\n\nfunction defer(fn) {\n  setTimeout(fn, 100);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

运行时输出:

\n\n
$ node deferred-test.js \nProgrammatic test suite creation.\n\nProgramatic Suite\n  \xe2\x9c\x93 My test\n  1) My (failing) test\n\n  1 passing (7ms)\n  1 failing\n\n  1) Programatic Suite My (failing) test:\n     Error: Failing test.\n      at Object.<anonymous> (deferred-test.js:5:31)\n      at node.js:935:3\n
Run Code Online (Sandbox Code Playgroud)\n\n

不过,我希望能够将此测试包含在我的应用程序中的所有(静态定义的)摩卡运行测试套件中。

\n