Search code examples
javascriptnode.jsunit-testingmocha.jssinon-chai

Stub dependent function with sinon and proxyquire does not print stub result


I wrote a unit test for _getuser() but I don't see console.log print stub result.Also test coverage shows line 'let user = result.user; console.log('User'+JSON.stringify(result));' is uncovered.Why stub result does not print in console log in getUser() function in LogInCommand class. I see result shows undefined in unit test.

// userApi.js

    'use strict';
    const config = require('../../config/config');
    const api = require('./apiService');

    class UserApi {
        constructor() {
        }
        getUser(userId) {
            return api.get({
                url: config.url,
                qs: {
                    includeInactive: true,
                    id: userId,
                    startIndex: 0,
                    maxResults: 1
                },
                headers: {
                    Accept: 'application/json;',
                    'Connection': 'Keep-Alive'
                }
            });
        }

    }
    module.exports = UserApi;

    // LoginCommand.js

    'use restrict';

    const userApi = require('../../api/userApi');
    class LogInCommand {
        constructor() {
        }
        async _getUser(userId) {
            let result = await new userApi().getUser(userId);
            let user = result.user;
            console.log('User'+JSON.stringify(result));
            return user;
        }

    }

    module.exports = LogInCommand;

    //LoginCommand.test.js
    describe('Test LogInCommand Class',function(){
      it.only('_getUser function should return user',    async ()=> { 
            let apiData= {
                user:'abc'
            };
          let logincmd = proxyquire('../LogInCommand.js', {
                userApi : { getUser : Promise.resolve(apiData) },'@noCallThru':true});
            let obj= new logincmd();
            let result= await obj._getUser(client);
        });

    });

Solution

  • The proxyquire configuration is incorrect in your current setup. Proxyquire maps the string value passed in a require call to the desired mock/stub values. Try the following instead:

    let logincmd = proxyquire('../LogInCommand.js', {
      '../../api/userApi' : { getUser : Promise.resolve(apiData) },
      '@noCallThru':true
    });