Node js Express Sinon Spy Stub Mock Question

87 views Asked by At

I have been trying to get stubs to work and have tried everything mentioned in every article and guide to try and fix my issue. I will include all imports even ones not used so you someone can see what has possibly been tried. My problem is that I am unable to stub method or function call imported into a file under test.

controller
./account-controller.js

"use strict";

const AccountService = require("../services/account.service");

exports.post = (request, response) => {
  AccountService.post(request, response);
};
service
./account-service.js

"use strict";

const bcrypt = require("bcryptjs");

const OTPFieldsEnum = require("../enums/otp-fields.enum");
const { notUndefOrNull } = require("../functions/data-checker.function");
const { generateOTP } = require("../functions/otp.function");
const db = require("../models");
const {
  account: Account,
  profileUser: ProfileUser,
  profileVerification: ProfileVerification,
  message: Message
} = db;
const MessageService = require("../services/message.service");
const ProfileVerificationService = require("../services/profile-verification.service");
const RoleService = require("../services/role.service");
const TokenService = require("./token.service");
const sendEmail = require("../utils/email/send-email");
const { logger } = require("../utils/logger");

const signInAttempts = new Map();

exports.post = (request, response) => {
  // Logic removed to shorten viewing
  return response.status(201).json({ message: "Account created successfully!" });
};
account controller test
./account.controller.spec.js
I want to test AccountController.post was called and AccountService.post was also called

I do not care about what service call returns that will be tested in service


const assert = require("assert");
const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');
const rewire = require('rewire');
const referee = require("@sinonjs/referee");
const httpMocks = require('node-mocks-http');
const proxyquire = require('proxyquire');
const ServerFactory = require("../server-factory");
const AccountController = require("../../controllers/account.controller");
const AccountService = require("../../services/account.service");

const refereeAssert = referee.assert;
const sandbox = sinon.createSandbox();

chai.use(sinonChai);

describe("api/controllers/account.controller - AccountController", () => {
  //let accountController = require("../../controllers/account.controller");
  //let accountService = require("../../services/account.service");
  const request = httpMocks.createRequest({
    "headers": {
      "test": "test_data"
    }
  });
  const response = httpMocks.createResponse();
  const accountIn = {
    id: "1",
    uuid: "0000-00000-00000-00001",
    email: "[email protected]",
    password: "12345678",
    over13CheckAgreement: true,
    accountActivated: true,
    passwordResetRequested: false,
    passwordSignInError: false,
    messages: []
  };

  before(async () => {
    await ServerFactory.init();
  });

  after(async () => {
    await ServerFactory.close();
  });

  afterEach(() => {
    //accountController = rewire("../../controllers/account.controller");
    //accountService = rewire("../../services/account.service");

    sandbox.restore();
    sinon.restore();
  });

  describe('exports', () => {

    describe('post', () => {

      it('should call AccountService.post() from exports.post and return response', async () => {
        const postServiceStub = sinon.stub(AccountService, 'postService').returns(Promise.resolve(response));
        const result = await AccountController.post();

        assert.equal(postServiceStub.calledOnce, true);
      });
    });
  });
});

No matter what I try AccountService will not stub and the call inside of AccountController.post keeps going into the call.

0

There are 0 answers