如何在 Mocha 中故意使空占位符测试失败?
How to make empty placeholder tests intentionally fail in Mocha?
我正在用 NodeJS 编写 API 并使用 Mocha、Chai 和 SuperTest 进行测试。我使用的是一种典型的测试驱动方法,首先编写测试,然后用工作代码满足这些测试。但是,由于所有不同排列的测试数量,我已经开始编写空的占位符测试,以便我拥有所有 it('should...')
描述,以提醒我在使用该功能时要测试的内容。例如:
it 'should not retrieve documents without an authorized user', (done) ->
done()
这个问题是 done()
在没有任何断言的情况下被调用,所以测试被认为是通过的,所以我添加了以下断言。
false.should.equal true # force failure
但这是一个 hack,Mocha 显示的失败原因似乎令人困惑,尤其是当其他完整测试可能失败时。
是否有任何官方方法可以在 Mocha 中故意使这样的占位符测试失败?
这实际上是一个很好的问题,因为我也会发现它非常有用。看完之后,我想创建自己的包装器 "todo" 或 "fail" 函数,您可以在整个代码库中重复使用。
下面的示例使用了一个名为 todo 的函数,它将打印出文本 "not yet implemented"。这可能作为一个单独的模块很有用,即使您可以导入并用于所有测试。可能需要稍微修改一下代码...
chai 断言中的示例
var assert = require('chai').assert;
function todo() {
assert(false, "method not yet implemented");
};
describe("some code", function(){
it("should fail something", function(){
todo();
});
});
使用 chai assert 的示例,带有 fail 选项(尽管看起来不必要)
var assert = require('chai').assert;
function todo() {
assert.fail(true, true, "method not yet implemented"); //1st 2 args can be anything really
};
describe("some code", function(){
it("should fail something", function(){
todo();
});
});
将测试标记为尚未准备好进行测试的官方方法是使用 skip
,这是一种显示为 describe
和 it
字段的方法。这是一个例子:
describe("not skipped", function () {
it("bar", function () {
throw new Error("fail");
});
it.skip("blah", function () {
throw new Error("fail");
});
});
describe.skip("skipped", function () {
it("something", function () {
throw new Error("fail");
});
});
上面的代码,当放在 test.js
文件中并且 运行 和 $ mocha --reporter=spec test.js
时,会产生:
not skipped
1) bar
- blah
skipped
- something
0 passing (4ms)
2 pending
1 failing
1) not skipped bar:
Error: fail
at Context.<anonymous> (/tmp/t33/test.js:3:15)
at callFn (/home/ldd/local/lib/node_modules/mocha/lib/runnable.js:223:21)
at Test.Runnable.run (/home/ldd/local/lib/node_modules/mocha/lib/runnable.js:216:7)
at Runner.runTest (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:374:10)
at /home/ldd/local/lib/node_modules/mocha/lib/runner.js:452:12
at next (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:299:14)
at /home/ldd/local/lib/node_modules/mocha/lib/runner.js:309:7
at next (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:247:23)
at Object._onImmediate (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:276:5)
at processImmediate [as _immediateCallback] (timers.js:354:15)
以-
开头的测试名称被跳过。此外,在支持颜色的终端中,跳过的测试显示为蓝色(与红色相反,失败的测试为红色,绿色为通过)。跳过的测试被称为 "pending",因此 Mocha 将跳过的测试数报告为“2 pending”。
截至 05/19/2018 这是官方方式:https://mochajs.org/#pending-tests
未实现的测试不应该 fail
,它应该标记为 pending
。
将 mocha 测试标记为 not yet implemented
的简洁方法是不将回调函数传递给 it
处理程序。
describe("Traverse", function(){
describe("calls the visitor function", function(){
it("at every element inside an array")
it("at every level of a tree")
})
})
运行 mocha test
会将您未实现的测试显示为挂起。
$ mocha test
Traverse
calls the visitor function
- at every element inside an array
- at every level of a tree
0 passing (13ms)
2 pending
如果您将字符串或错误传递给 done()
,它将报告为错误。所以:
it 'should not retrieve documents without an authorized user', (done) ->
done('not implemented')
会导致测试失败并输出:
done() invoked with non-Error: not implemented
我喜欢@Canyon 的解决方案,即不传递回调来标记测试 "pending",但在我的情况下,我希望这些占位符使我的 CI 构建失败,因此使它们成为实际失败的测试这样更容易。
我正在用 NodeJS 编写 API 并使用 Mocha、Chai 和 SuperTest 进行测试。我使用的是一种典型的测试驱动方法,首先编写测试,然后用工作代码满足这些测试。但是,由于所有不同排列的测试数量,我已经开始编写空的占位符测试,以便我拥有所有 it('should...')
描述,以提醒我在使用该功能时要测试的内容。例如:
it 'should not retrieve documents without an authorized user', (done) ->
done()
这个问题是 done()
在没有任何断言的情况下被调用,所以测试被认为是通过的,所以我添加了以下断言。
false.should.equal true # force failure
但这是一个 hack,Mocha 显示的失败原因似乎令人困惑,尤其是当其他完整测试可能失败时。
是否有任何官方方法可以在 Mocha 中故意使这样的占位符测试失败?
这实际上是一个很好的问题,因为我也会发现它非常有用。看完之后,我想创建自己的包装器 "todo" 或 "fail" 函数,您可以在整个代码库中重复使用。
下面的示例使用了一个名为 todo 的函数,它将打印出文本 "not yet implemented"。这可能作为一个单独的模块很有用,即使您可以导入并用于所有测试。可能需要稍微修改一下代码...
chai 断言中的示例
var assert = require('chai').assert;
function todo() {
assert(false, "method not yet implemented");
};
describe("some code", function(){
it("should fail something", function(){
todo();
});
});
使用 chai assert 的示例,带有 fail 选项(尽管看起来不必要)
var assert = require('chai').assert;
function todo() {
assert.fail(true, true, "method not yet implemented"); //1st 2 args can be anything really
};
describe("some code", function(){
it("should fail something", function(){
todo();
});
});
将测试标记为尚未准备好进行测试的官方方法是使用 skip
,这是一种显示为 describe
和 it
字段的方法。这是一个例子:
describe("not skipped", function () {
it("bar", function () {
throw new Error("fail");
});
it.skip("blah", function () {
throw new Error("fail");
});
});
describe.skip("skipped", function () {
it("something", function () {
throw new Error("fail");
});
});
上面的代码,当放在 test.js
文件中并且 运行 和 $ mocha --reporter=spec test.js
时,会产生:
not skipped
1) bar
- blah
skipped
- something
0 passing (4ms)
2 pending
1 failing
1) not skipped bar:
Error: fail
at Context.<anonymous> (/tmp/t33/test.js:3:15)
at callFn (/home/ldd/local/lib/node_modules/mocha/lib/runnable.js:223:21)
at Test.Runnable.run (/home/ldd/local/lib/node_modules/mocha/lib/runnable.js:216:7)
at Runner.runTest (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:374:10)
at /home/ldd/local/lib/node_modules/mocha/lib/runner.js:452:12
at next (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:299:14)
at /home/ldd/local/lib/node_modules/mocha/lib/runner.js:309:7
at next (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:247:23)
at Object._onImmediate (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:276:5)
at processImmediate [as _immediateCallback] (timers.js:354:15)
以-
开头的测试名称被跳过。此外,在支持颜色的终端中,跳过的测试显示为蓝色(与红色相反,失败的测试为红色,绿色为通过)。跳过的测试被称为 "pending",因此 Mocha 将跳过的测试数报告为“2 pending”。
截至 05/19/2018 这是官方方式:https://mochajs.org/#pending-tests
未实现的测试不应该 fail
,它应该标记为 pending
。
将 mocha 测试标记为 not yet implemented
的简洁方法是不将回调函数传递给 it
处理程序。
describe("Traverse", function(){
describe("calls the visitor function", function(){
it("at every element inside an array")
it("at every level of a tree")
})
})
运行 mocha test
会将您未实现的测试显示为挂起。
$ mocha test
Traverse
calls the visitor function
- at every element inside an array
- at every level of a tree
0 passing (13ms)
2 pending
如果您将字符串或错误传递给 done()
,它将报告为错误。所以:
it 'should not retrieve documents without an authorized user', (done) ->
done('not implemented')
会导致测试失败并输出:
done() invoked with non-Error: not implemented
我喜欢@Canyon 的解决方案,即不传递回调来标记测试 "pending",但在我的情况下,我希望这些占位符使我的 CI 构建失败,因此使它们成为实际失败的测试这样更容易。