Mocha 测试在应该失败的时候不会失败
Mocha tests not failing when they should
我正在尝试测试我的路由文件,mocha 返回了我所有期望的成功,即使我编写了一些绝对应该失败的代码。我添加了一个 2+2 = 5 测试只是为了确保 something 会失败。我在我的断言块中完成了()。
我正在使用 MEAN 堆栈,并且我尝试使用 jasmine 测试节点文件,因为我已经在使用它来测试 Angular 文件,但是遇到了很多疯狂的错误,所以我抛开所有这些,决定尝试摩卡咖啡。
结果:
Routes
1) makes sure something fails
GET /
√ returns status code 200
GET /nonexistent
√ returns status code 400
GET /api/todos
√ returns status code 200
√ returns a list of todos
测试文件
// test/routes.spec.js
var request = require('request');
var expect = require('chai').expect;
describe('Routes', function() {
var base_url = "http://localhost:8080/"
// does fail as expected
it("makes sure something fails", function () {
expect(2 + 2).to.equal(5);
});
describe("GET /", function() {
it("returns status code 200", function() {
request(base_url, function(error, response, body) {
expect(response.statusCode).to.equal(200);
done();
});
});
});
//should fail
describe("GET /nonexistent", function() {
it("returns status code 400", function () {
request(base_url + "/nonexistent", function (error, response, body) {
expect(response.statusCode).to.equal(200);
done();
});
});
});
describe("GET /api/todos", function() {
it("returns status code 200", function() {
request(base_url + "/api/todos", function(error, response, body) {
expect(response.statusCode).to.equal(200);
done();
});
});
//should fail
it("returns a list of todos", function() {
request(base_url + "/api/todos", function(error, response, body) {
console.log(body);
expect(body).to.equal("abcd");
done();
});
});
});
});
路线文件:
// app/routes.js
var Todo = require('./models/todo');
module.exports = function(app) {
// api ---------------------------------------------
// get all todos
app.get('/api/todos', function (req, res) {
Todo.find(function (err, todos) {
if (err)
res.send(err)
res.json(todos);
});
});
// create todo and send back all todos after creation
app.post('/api/todos', function (req, res) {
Todo.create({
text: req.body.text,
done: false
}, function (err, todo) {
if (err)
res.send(err);
Todo.find(function (err, todos) {
if (err)
res.send(err)
res.json(todos);
});
});
});
// delete a todo
app.delete('/api/todos/:todo_id', function (req, res) {
Todo.remove({
_id: req.params.todo_id
}, function (err, todo) {
if (err)
res.send(err);
Todo.find(function (err, todos) {
if (err)
res.send(err)
res.json(todos);
})
})
})
// application --------------------------------------
app.get('*', function (req, res) {
res.sendFile(__dirname + '/public/index.html');
});
};
您想使用 done
回调,但是 none 您的测试 在传递给 it
的回调参数中声明了 它.例如,您的第一个测试应该是:
it("returns status code 200", function (done) { // <== Add parameter here!
request(base_url, function(error, response, body) {
expect(response.statusCode).to.equal(200);
done();
});
});
没有参数,Mocha 认为测试是同步的。所以它不会等待 request
调用它的回调,并立即结束。 done
未定义的事实不会导致错误,因为 JavaScript 解释器在 Mocha 认为测试结束之前没有到达 done()
。
我是 JavaScript 新手,不得不更改我的代码
it('getReports', () => {
getReports()
.then((res) => {
assert.equal(200, res.statusCode);
});
});
至
it('getReports', () => getReports()
.then((res) => {
assert.equal(200, res.statusCode);
}));
即不得不删除第一组大括号。
此后 Mocha 测试报告错误。
从 Node 8 开始,您可以使用本机 async/await 方法进行请求和测试。
首先使用请求承诺或request-promise-native代替请求。
const request = require('request-promise-native');
测试async/await:
// testing success results - any error will fail the test
it('Returns status code 200', async () => {
const response = await request(base_url);
expect(response.statusCode).to.equal(200);
});
// testing for a particular error
it('Testing a particular error is thrown', async () => {
let error;
try {
await request(base_url);
} catch (err) {
error = err;
}
expect(error).to.be.ok;
expect(error.message).to.equal('Expected error message');
});
在我的例子中 运行 使用以下命令测试文件解决了问题。
node --unhandled-rejections=strict node_modules/.bin/mocha --require @babel/register --require babel-polyfill test/**/*.test.js
我正在尝试测试我的路由文件,mocha 返回了我所有期望的成功,即使我编写了一些绝对应该失败的代码。我添加了一个 2+2 = 5 测试只是为了确保 something 会失败。我在我的断言块中完成了()。
我正在使用 MEAN 堆栈,并且我尝试使用 jasmine 测试节点文件,因为我已经在使用它来测试 Angular 文件,但是遇到了很多疯狂的错误,所以我抛开所有这些,决定尝试摩卡咖啡。
结果:
Routes
1) makes sure something fails
GET /
√ returns status code 200
GET /nonexistent
√ returns status code 400
GET /api/todos
√ returns status code 200
√ returns a list of todos
测试文件
// test/routes.spec.js
var request = require('request');
var expect = require('chai').expect;
describe('Routes', function() {
var base_url = "http://localhost:8080/"
// does fail as expected
it("makes sure something fails", function () {
expect(2 + 2).to.equal(5);
});
describe("GET /", function() {
it("returns status code 200", function() {
request(base_url, function(error, response, body) {
expect(response.statusCode).to.equal(200);
done();
});
});
});
//should fail
describe("GET /nonexistent", function() {
it("returns status code 400", function () {
request(base_url + "/nonexistent", function (error, response, body) {
expect(response.statusCode).to.equal(200);
done();
});
});
});
describe("GET /api/todos", function() {
it("returns status code 200", function() {
request(base_url + "/api/todos", function(error, response, body) {
expect(response.statusCode).to.equal(200);
done();
});
});
//should fail
it("returns a list of todos", function() {
request(base_url + "/api/todos", function(error, response, body) {
console.log(body);
expect(body).to.equal("abcd");
done();
});
});
});
});
路线文件:
// app/routes.js
var Todo = require('./models/todo');
module.exports = function(app) {
// api ---------------------------------------------
// get all todos
app.get('/api/todos', function (req, res) {
Todo.find(function (err, todos) {
if (err)
res.send(err)
res.json(todos);
});
});
// create todo and send back all todos after creation
app.post('/api/todos', function (req, res) {
Todo.create({
text: req.body.text,
done: false
}, function (err, todo) {
if (err)
res.send(err);
Todo.find(function (err, todos) {
if (err)
res.send(err)
res.json(todos);
});
});
});
// delete a todo
app.delete('/api/todos/:todo_id', function (req, res) {
Todo.remove({
_id: req.params.todo_id
}, function (err, todo) {
if (err)
res.send(err);
Todo.find(function (err, todos) {
if (err)
res.send(err)
res.json(todos);
})
})
})
// application --------------------------------------
app.get('*', function (req, res) {
res.sendFile(__dirname + '/public/index.html');
});
};
您想使用 done
回调,但是 none 您的测试 在传递给 it
的回调参数中声明了 它.例如,您的第一个测试应该是:
it("returns status code 200", function (done) { // <== Add parameter here!
request(base_url, function(error, response, body) {
expect(response.statusCode).to.equal(200);
done();
});
});
没有参数,Mocha 认为测试是同步的。所以它不会等待 request
调用它的回调,并立即结束。 done
未定义的事实不会导致错误,因为 JavaScript 解释器在 Mocha 认为测试结束之前没有到达 done()
。
我是 JavaScript 新手,不得不更改我的代码
it('getReports', () => {
getReports()
.then((res) => {
assert.equal(200, res.statusCode);
});
});
至
it('getReports', () => getReports()
.then((res) => {
assert.equal(200, res.statusCode);
}));
即不得不删除第一组大括号。
此后 Mocha 测试报告错误。
从 Node 8 开始,您可以使用本机 async/await 方法进行请求和测试。
首先使用请求承诺或request-promise-native代替请求。
const request = require('request-promise-native');
测试async/await:
// testing success results - any error will fail the test
it('Returns status code 200', async () => {
const response = await request(base_url);
expect(response.statusCode).to.equal(200);
});
// testing for a particular error
it('Testing a particular error is thrown', async () => {
let error;
try {
await request(base_url);
} catch (err) {
error = err;
}
expect(error).to.be.ok;
expect(error.message).to.equal('Expected error message');
});
在我的例子中 运行 使用以下命令测试文件解决了问题。
node --unhandled-rejections=strict node_modules/.bin/mocha --require @babel/register --require babel-polyfill test/**/*.test.js