我正在尝试测试我的路线文件,而mocha正在为我的所有期望返回成功,即使我编写了一对绝对失败的情侣。我添加了一个2 + 2 = 5测试,以确保某些会失败。我在断言块中做了()。
我正在使用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');
});
};
答案 0 :(得分:7)
您希望使用done
回调,但在传递给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()
。
答案 1 :(得分:0)
我是JavaScript新手,不得不从更改我的代码
it('getReports', () => {
getReports()
.then((res) => {
assert.equal(200, res.statusCode);
});
});
到
it('getReports', () => getReports()
.then((res) => {
assert.equal(200, res.statusCode);
}));
即必须删除第一组大括号。
此后,Mocha测试报告了一个错误。
答案 2 :(得分:0)
从节点8开始,您可以使用本机异步/等待方法进行请求和测试。
首先使用request-promise或request-promise-native代替请求。
const request = require('request-promise-native');
使用异步/等待测试:
// 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');
});
答案 3 :(得分:0)
就我而言,使用以下命令运行测试文件即可解决问题。
def callback(self, text)
self.ids.textbox.text = text