user3618284
user3618284

Reputation: 37

How to mock a function with req and res parameters using sinon?

I want to pass some test using mocks and stubs on sinon. controler.js:

const User = require('./models/user');
module.exports.userRead = function userRead(req, res) {
 User
 .query()
 .then(users => {
    res.render('results', {data: users});
  })
 .catch((err) => {
    res.render('error');
 });

user.test.js:

const sinon = require('sinon');
const controller = require('../controler');
const Provider  = require('../provider');

describe('Testing userRead', () => {
   const appStub = sinon.stub(Provider,'query');
   test('should returns users', () => {
       controler.userRead(req, res);

       appStub.restore();
       appStub.verify();
   });
});

The test can't pass and I got this error:

ReferenceError: req is not defined

How can I fix that?

Upvotes: 1

Views: 1123

Answers (1)

Alex
Alex

Reputation: 38499

In your code, there's nothing called req

In your particular instance, just pass in {} (empty object) since your controller isn't yet doing anything with req

const sinon = require('sinon');
const controller = require('../controler');
const Provider  = require('../provider');

describe('Testing userRead', () => {
   const appStub = sinon.stub(Provider,'query');
   test('should returns users', () => {
       controler.userRead({}, res);

       appStub.restore();
       appStub.verify();
   });
});

Another (better) alternative is to use https://github.com/howardabrams/node-mocks-http

const sinon = require('sinon');
const httpMocks = require('node-mocks-http');
const controller = require('../controler');
const Provider  = require('../provider');

describe('Testing userRead', () => {
   const appStub = sinon.stub(Provider,'query');
   const req = httpMocks.createRequest();
   //can setup req here

   test('should returns users', () => {
       controler.userRead(req, res);

       appStub.restore();
       appStub.verify();
   });
});

Upvotes: 2

Related Questions