如何让 Mocha 无法通过测试
How to get Mocha to fail a test
我有以下测试:
it.only('validation should fail', function(done) {
var body = {
title: "dffdasfsdfsdafddfsadsa",
description: "Postman Description",
beginDate: now.add(3, 'd').format(),
endDate: now.add(4, 'd').format()
}
var rules = eventsValidation.eventCreationRules();
var valMessages = eventsValidation.eventCreationMessages();
indicative
.validateAll(rules, body, valMessages)
.then(function(data) {
console.log("SHOULD NOT GET HERE");
should.fail("should not get here");
done();
})
.catch(function(error) {
console.log("SHOULD GET HERE");
console.log(error);
});
done();
});
测试执行路径正确。当我有验证数据时,它会转到 "SHOULD NOT GET HERE"。测试确实是为了确保它没有。当我输入非验证数据时,代码确实会转到 "SHOULD GET HERE"。所以验证规则有效。
我想要做的是确保当我有错误的验证数据时测试失败并且它验证了。然而,当我 运行 它与它验证的良好数据一样时, 运行 失败了,但 mocha 仍然将其标记为通过。如果执行到 "SHOULD NOT GET HERE",我希望它失败。
我试过 throw new Error("fail");也没有运气。在这两种情况下,它实际上似乎也是 运行 .catch 块中的代码。
有什么建议吗?
我在 similar question 中找到了解决方案。写这个问题是因为那些解决方案似乎对我不起作用。
将 chai-as-promised
与本机 Mocha promise 处理程序一起使用。
var chai = require('chai').use(require('chai-as-promised'));
var should = chai.should(); // This will enable .should for promise assertions
您不再需要 done
,只需 return 承诺。
// Remove `done` from the line below
it.only('validation should fail', function(/* done */) {
var body = {
title: "dffdasfsdfsdafddfsadsa",
description: "Postman Description",
beginDate: now.add(3, 'd').format(),
endDate: now.add(4, 'd').format()
}
var rules = eventsValidation.eventCreationRules();
var valMessages = eventsValidation.eventCreationMessages();
// Return the promise
return indicative
.validateAll(rules, body, valMessages)
.should.be.rejected; // The test will pass only if the promise is rejected
// Remove done, we no longer need it
// done();
});
您可以拨打assert.fail
:
it("should return empty set of tags", function()
{
assert.fail("actual", "expected", "Error message");
});
此外,如果您使用参数调用 done()
函数,Mocha 会认为测试失败。
例如:
it("should return empty set of tags", function(done)
{
done(new Error("Some error message here"));
});
虽然第一个对我来说更清楚。
在 ES2017 async
/await
世界中 chai-as-promised
并不需要那么多。虽然简单的拒绝是一个地方 chai-as-promised
仍然使用起来更整洁。
如果您想更详细地测试错误,则需要 catch
。
it.only('validation should fail', async function(){
let body = { ... }
let rules = eventsValidation.eventCreationRules()
let valMessages = eventsValidation.eventCreationMessages()
try {
await indicative.validateAll(rules, body, valMessages)
} catch (error) {
expect(error).to.be.instanceOf(Error)
expect(error.message).to.match(/Oh no!/)
return
}
expect.fail(null, null, 'validateAll did not reject with an error')
// or throw new Error('validateAll did not reject with an error')
})
async
/await
需要 Node.js 7.6+ 或像 Babel
这样的编译器
这个简单的投掷对我有用
describe('Lead', () => {
it('should create a new lead', async () => {
throw 'not implemented'
})
})
我有以下测试:
it.only('validation should fail', function(done) {
var body = {
title: "dffdasfsdfsdafddfsadsa",
description: "Postman Description",
beginDate: now.add(3, 'd').format(),
endDate: now.add(4, 'd').format()
}
var rules = eventsValidation.eventCreationRules();
var valMessages = eventsValidation.eventCreationMessages();
indicative
.validateAll(rules, body, valMessages)
.then(function(data) {
console.log("SHOULD NOT GET HERE");
should.fail("should not get here");
done();
})
.catch(function(error) {
console.log("SHOULD GET HERE");
console.log(error);
});
done();
});
测试执行路径正确。当我有验证数据时,它会转到 "SHOULD NOT GET HERE"。测试确实是为了确保它没有。当我输入非验证数据时,代码确实会转到 "SHOULD GET HERE"。所以验证规则有效。
我想要做的是确保当我有错误的验证数据时测试失败并且它验证了。然而,当我 运行 它与它验证的良好数据一样时, 运行 失败了,但 mocha 仍然将其标记为通过。如果执行到 "SHOULD NOT GET HERE",我希望它失败。
我试过 throw new Error("fail");也没有运气。在这两种情况下,它实际上似乎也是 运行 .catch 块中的代码。
有什么建议吗? 我在 similar question 中找到了解决方案。写这个问题是因为那些解决方案似乎对我不起作用。
将 chai-as-promised
与本机 Mocha promise 处理程序一起使用。
var chai = require('chai').use(require('chai-as-promised'));
var should = chai.should(); // This will enable .should for promise assertions
您不再需要 done
,只需 return 承诺。
// Remove `done` from the line below
it.only('validation should fail', function(/* done */) {
var body = {
title: "dffdasfsdfsdafddfsadsa",
description: "Postman Description",
beginDate: now.add(3, 'd').format(),
endDate: now.add(4, 'd').format()
}
var rules = eventsValidation.eventCreationRules();
var valMessages = eventsValidation.eventCreationMessages();
// Return the promise
return indicative
.validateAll(rules, body, valMessages)
.should.be.rejected; // The test will pass only if the promise is rejected
// Remove done, we no longer need it
// done();
});
您可以拨打assert.fail
:
it("should return empty set of tags", function()
{
assert.fail("actual", "expected", "Error message");
});
此外,如果您使用参数调用 done()
函数,Mocha 会认为测试失败。
例如:
it("should return empty set of tags", function(done)
{
done(new Error("Some error message here"));
});
虽然第一个对我来说更清楚。
在 ES2017 async
/await
世界中 chai-as-promised
并不需要那么多。虽然简单的拒绝是一个地方 chai-as-promised
仍然使用起来更整洁。
如果您想更详细地测试错误,则需要 catch
。
it.only('validation should fail', async function(){
let body = { ... }
let rules = eventsValidation.eventCreationRules()
let valMessages = eventsValidation.eventCreationMessages()
try {
await indicative.validateAll(rules, body, valMessages)
} catch (error) {
expect(error).to.be.instanceOf(Error)
expect(error.message).to.match(/Oh no!/)
return
}
expect.fail(null, null, 'validateAll did not reject with an error')
// or throw new Error('validateAll did not reject with an error')
})
async
/await
需要 Node.js 7.6+ 或像 Babel
这个简单的投掷对我有用
describe('Lead', () => {
it('should create a new lead', async () => {
throw 'not implemented'
})
})