摩卡测试应该没有失败

时间:2016-11-16 16:33:59

标签: node.js mocha chai

我正在尝试测试我的路线文件,而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');
    });
};

4 个答案:

答案 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