2017-05-03 90 views
0

所以我創建一個測試套件,我簡單的應用程序...未捕獲的錯誤節點的js

我碰到一些誤區:

Server is running on port 3000 
    POST /todos 
    1) Uncaught error outside test suite 
(node:5030) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017] 
    2) "before each" hook for "should create a new todo" 


    0 passing (2s) 
    2 failing 

    1) Uncaught error outside test suite: 
    Uncaught MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017] 
     at Pool.<anonymous> (node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:328:35) 
     at Connection.<anonymous> (node_modules/mongoose/node_modules/mongodb-core/lib/connection/pool.js:274:12) 
     at Socket.<anonymous> (node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:177:49) 
     at emitErrorNT (net.js:1278:8) 
     at _combinedTickCallback (internal/process/next_tick.js:74:11) 
     at process._tickCallback (internal/process/next_tick.js:98:9) 

    2) "before each" hook for "should create a new todo": 
    Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. 


npm ERR! Test failed. See above for more details. 

這裏是我的測試:

const expect = require('expect'); 
const request = require('supertest'); 
const {ObjectID} = require('mongodb'); 

const {app} = require('./../server'); 
const {Todo} = require('./../models/todo'); 

const todos = [{ 
    _id: new ObjectID(), 
    text: 'First test todo' 
}, { 
    _id: new ObjectID(), 
    text: 'Second test todo' 
}]; 

beforeEach((done) => { 
    Todo.remove({}).then(() => { 
    return Todo.insertMany(todos); 
    }).then(() => done()); 
}); 

describe('POST /todos',() => { 
    it('should create a new todo', (done) => { 
    var text = 'Test todo text'; 

    request(app) 
     .post('/todos') 
     .send({text}) 
     .expect(200) 
     .expect((res) => { 
     expect(res.body.text).toBe(text); 
     }) 
     .end((err, res) => { 
     if (err) { 
      return done(err); 
     } 

     Todo.find({text}).then((todos) => { 
      expect(todos.length).toBe(1); 
      expect(todos[0].text).toBe(text); 
      done(); 
     }).catch((e) => done(e)); 
     }); 
    }); 

    it('should not create todo with invalid body data', (done) => { 
    request(app) 
     .post('/todos') 
     .send({}) 
     .expect(400) 
     .end((err, res) => { 
     if (err) { 
      return done(err); 
     } 

     Todo.find().then((todos) => { 
      expect(todos.length).toBe(2); 
      done(); 
     }).catch((e) => done(e)); 
     }); 
    }); 
}); 

describe('GET /todos',() => { 
    it('should get all todos', (done) => { 
    request(app) 
     .get('/todos') 
     .expect(200) 
     .expect((res) => { 
     expect(res.body.todos.length).toBe(2); 
     }) 
     .end(done); 
    }); 
}); 

describe('GET /todos/:id',() => { 
    it('should return todo doc', (done) => { 
    request(app) 
     .get(`/todos/${todos[0]._id.toHexString()}`) 
     .expect(200) 
     .expect((res) => { 
     expect(res.body.todo.text).toBe(todos[0].text); 
     }) 
     .end(done); 
    }); 

    it('should return 404 if todo not found', (done) => { 
    var hexId = new ObjectID().toHexString(); 

    request(app) 
     .get(`/todos/${hexId}`) 
     .expect(404) 
     .end(done); 
    }); 

    it('should return 404 for non-object ids', (done) => { 
    request(app) 
     .get('/todos/123abc') 
     .expect(404) 
     .end(done); 
    }); 
}); 

而且這裏是我的server.js

var express = require('express'); 
var bodyParser = require('body-parser'); 
var {ObjectID} = require('mongodb'); 

var {mongoose} = require('./db/mongoose.js'); 
var {Todo} = require('./models/todo'); 
var {User} = require('./models/user'); 

var app = express(); 
const port = process.env.PORT || 3000; 

app.use(bodyParser.json()); 

app.post('/todos', (req, res) =>{ 
    // console.log(req.body); 
    var todo = new Todo({ 
    text: req.body.text 
    }); 

    todo.save().then((doc) => { 
    res.send(doc); 
    }, (err) => { 
    res.status(400).send(err); 
    }); 
}); 

// GET /todos/12345 
app.get('/todos/:id', (req, res) => { 
    // req.send(req.params); - test localhost:3000/todos/123 on postman GET 
    var id = req.params.id; 

    // Validate id using isValid 
if(!ObjectID.isValid(id)){ 
    // Respond 404 and send back and an empty bodyParser 
    return res.status(404).send(); 
} 


    // findById 
Todo.findById(id).then((todo) =>{ 
if(!todo){ 
    return res.status(404).send(); 
} 
res.send({todo}); 

}).catch((e) =>{ 
    res.status(400).send(); 
}); 


}); 

app.listen(port,() => { 
    console.log(`Server is running on port ${port}`); 
}); 

module.exports = {app}; 

任何想法w帽子造成我的錯誤

大部分時間它的要求,它不能得到所有todos。

請幫忙!

回答

0

任何想法是什麼導致我的錯誤

某處,你有一個承諾,最終拒絕,你從來沒有掛鉤拒絕處理程序(例如,catch或第二個參數then)。正是那就是是調試的問題,但比如這個代碼:

beforeEach((done) => { 
    Todo.remove({}).then(() => { 
    return Todo.insertMany(todos); 
    }).then(() => done()); 
}); 

...有你從來沒有掛鉤的拒絕處理的承諾。所以如果這個承諾被拒絕,你會得到未處理的拒絕錯誤。

實際的問題可能不是那個特定的問題(儘管它確實需要一個拒絕處理程序),但是如果沒有,它會以另一種方式使用。

規則是:代碼必須處理承諾拒絕,或傳遞承諾,以便他們可以在調用者級別處理。如果代碼沒有通過承諾(如上面的beforeEach),它必須處理拒絕。

-1

嘗試添加此:

if(!module.parent){ 
app.listen(port,() => { 
    console.log(`Server is running on port ${port}`); 
}); 
} 
+0

你應該說明你正在做的,而不是給他什麼/她的代碼說試試這個。它不像你會跳橋,如果有人說你應該跳橋,因爲這是解決方案 – Tomm