node.jsunit-testingasync-awaitsinonstubs

Unit test with promise handling - node.js


i want to do a unit test with async function on the code. and here is my code on user.test.js

'use strict'
const UserDomain = require("../../../../../../bin/modules/users/repositories/commands/domain")
const UserHandler = require("../../../../../../bin/modules/users/repositories/commands/command_handler")
const expect = require('chai').expect;
const assert = require('chai').assert;
const sinon = require('sinon');
describe('User domain', () => {
describe('".login(data)"', () => {
    let user;
    beforeEach( () => {
        user = {
            clientId : "adithyavisnu",
            clientSecret : "secretOfmine@19"
        }

    });
    it("should return error when username/password is empty", (done)=> {
        done();
        // let 
    })

    it("should return object", async () => {
        const domainStub = sinon.stub(UserDomain.prototype, 'login');
        const result = await UserHandler.login(user);
        sinon.assert.calledOnce(domainStub);
        domainStub.restore();
    })
});
});

If the normal code (not the unit test code above) the const result = await UserHandler.login(user); will have an object response, but when i do in user.test.js it do not get the response. the result is undefined.

here are the user_handler code

'use strict';
const User = require('./domain');
const login = async (data) => {
const postData = async () => {
    const user = new User();
    const result = await user.login(data);
    return result;
}
const response = await postData();
return response;
}

Is there something i did wrong on the code or some code is missing?

I am sorry if you do think there is unclear information

Thank you for the responses


Solution

  • In the normal flow, the UserHandler calls the Domain.login method and returns the result object. When you run the unit test you are stubbing the Domain.login method. so, it wont return the result as normal flow. You can either make the stub return some result object and test that or just spy the Domain.login instead of stubbing it , if you just want to just check that the Domain.login was called without altering its behavior. Read more on stubs/spies here if you would like - http://sinonjs.org/releases/v1.17.7/stubs/