2016-11-16 129 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

修復它。我知道它必須是瘋狂的簡單! –

相關問題