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.