2016-11-16 102 views
0

我试图测试我的路线文件,并且摩卡正在为我所有的期望返回成功,即使我已经编写了一对应该绝对失败的代码。我添加了2 + 2 = 5测试,以确保某些会失败。我在我的断言块中完成了()。摩卡测试没有失败,当他们应该

我正在使用MEAN堆栈,我试图用茉莉花来测试节点文件,因为我已经在使用它来测试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

你想使用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未定义这一事实不会导致错误,因为在Mocha认为测试结束之前,JavaScript解释器未达到done()

+0

修复它。我知道它必须是疯狂的简单! –