Rasika
Rasika

Reputation: 1

expected "location" header field - using mocha with supertest in node.js

I am not using express,instead i m using koa js 1.0. Here is a sample app for inserting user. It includes mocha with supertest for test purpose.

In app.js ->

var koa = require('koa');
var app = koa();
var routes = require('koa-route');

//routes
var userRoutes = require("./userRoutes.js");

app.use(routes.post("/user",userRoutes.add);
app.use(routes.get("/user/:id",userRoutes.get);

module.exports = app;

app.listen(3000);
console.log('Listening to port 3000');

In userRoutes.js ->

var parse = require('co-body');

var monk = require('monk');
var wrap = require('co-monk');
var db = monk("localhost/usersApi");
var users = wrap(db.get("users"));
module.exports.users = users;

module.exports.add = function *(){
  var postedUser = yield parse(this);

  var insertedUser = yield db.users.insert(postedUser);

  this.set("location","/user/" + insertedUser._id);
  this.status = 200;
 };

 module.exports.get = function *(id){
    this.body = "You passed me: " + id;
 };

In test.js ->

var app = require('./app.js');
var request = require('supertest').agent(app.listen());
describe('Simple User Api:',function () {
var test_user = {name:'Marcus',City:'Bandung,Indonesia'};

it('creates a new user',function (done) {
    //Post

    request
        .post('/user')
        .send(test_user)
        .expect('location',/^\/user\/[0-9a-fA-F]{24}$/)
        .expect(200,done);
});
});

in package.json -

"scripts": {
"start": "node --harmony app.js",
"test": "mocha --harmony test.js -u bdd -R spec"
},

when i run "npm test" command it gives below error:

Listening to port 3000


Simple User Api:

TypeError: Cannot read property 'insert' of undefined
  at Object.module.exports.add (D:\Nodejs\KoaCRUD\userRoutes.js:17:38)
  at next (native)
  at Object.<anonymous> (D:\Nodejs\KoaCRUD\node_modules\koa-         
route\index.js:34:19)
  at next (native)
  at Object.<anonymous>    
(D:\Nodejs\KoaCRUD\node_modules\koa\node_modules\koa-compos
 e\index.js:28:19)
  at next (native)
  at onFulfilled (D:\Nodejs\KoaCRUD\node_modules\co\index.js:65:19)
  at process._tickCallback (node.js:369:9)

1) creates a new user


0 passing (220ms)
1 failing

1) Simple User Api: creates a new user:
 Error: expected "location" header field
  at Test._assertHeader 
(D:\Nodejs\KoaCRUD\node_modules\supertest\lib\test.js:219:45)
  at Test._assertFunction 
(D:\Nodejs\KoaCRUD\node_modules\supertest\lib\test.js:265
:11)
  at Test.assert    
(D:\Nodejs\KoaCRUD\node_modules\supertest\lib\test.js:153:18)
  at assert (D:\Nodejs\KoaCRUD\node_modules\supertest\lib\test.js:131:12)
  at D:\Nodejs\KoaCRUD\node_modules\supertest\lib\test.js:128:5
  at Test.Request.callback 
(D:\Nodejs\KoaCRUD\node_modules\supertest\node_modules\s
uperagent\lib\node\index.js:603:3)
  at IncomingMessage.<anonymous> 
(D:\Nodejs\KoaCRUD\node_modules\supertest\node_mod
ules\superagent\lib\node\index.js:767:18)
  at endReadableNT (_stream_readable.js:921:12)



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

I searched on this a lot,but error not resolved. Anyone knows what is the issue? Thanks in advance.

Upvotes: 0

Views: 957

Answers (1)

John Paschal
John Paschal

Reputation: 85

Looks like you just made one little error in userRoutes.js

The line:

var insertedUser = yield db.users.insert(postedUser);

should be:

var insertedUser = yield users.insert(postedUser);

db is your monk variable, and you already wrapped that with co-monk so you just need to use users.insert, not db.users.insert

Upvotes: 1

Related Questions