模拟节点 js 控制器功能 - 调用服务的 getSubscriber

时间:2020-12-31 10:18:54

标签: node.js unit-testing jestjs mocking

我已经将 node js 代码开发为 MVC 架构。文件夹结构为Controller-->服务->模型。我尝试为以下代码编写单元测试。不幸的是,我无法模拟服务功能。所以请帮我解决它。

控制器

const SubscriberService = require('../../services/subscriber/subscriberService')
const response = require("../../config/response");
const constant = require('../../config/constant');
const SubscriberAnswerService = require('../../services/subscriberAnswer/subscriberAnswerService');
const path = require('path');

class SubscriberController {

    constructor() {
        this.subscriberService = new SubscriberService();
        this.subscriberAnswerService = new SubscriberAnswerService();
    }

    async getSubscriber(req, res) {
        try {
            var { userId } = req;
            const user = await this.subscriberService.findByUserId(userId);
            if (user != null) {

                res.send(response.res(true, constant.MSG.USER_DETAILS, user))
            } else {

                res.status(404).send(response.res(false, constant.MSG.USER_NOT_FOUND));
            }
        } catch (error) {

            res.status(constant.RESPONSE.INTERNAL_ERROR.CODE)
                .send(response.res(false, error.message))
        }
    }
}

服务

    async findByUserId(id) {

        const user = await Subscriber.findOne({ where: { id: id, status: 1 } });

        return user;
    }

单元测试代码

describe("Test SubscriberController", () => {
    it("Test getsubscriber", async () => {
        req.userId = 1;
        jest.spyOn(subscriberService, "findByUserId").mockReturnValue(subscriberResponse);
        await subscriberController.getSubscriber(req, res);
        expect(res.statusCode).toBe(500);
    });

});

问题:我模拟了 findByUserId 的服务功能,但它不起作用。它给出了以下错误。 error TypeError: Cannot read property 'findOne' of undefined

请给出模拟 findByUserId 函数的解决方案。

Subscriber.Controller.test.js

const subscriberModel = require("../src/models/subscriber/subscriberModel");
const SubscriberService = require("../src/services/subscriber/subscriberService");
const SubscriberController = require("../src/controllers/Subscriber/subscriberController");
const subscriberController = new SubscriberController();
const subscriberService = new SubscriberService();
const httpMocks = require("node-mocks-http");

jest.mock("../src/models/subscriber/subscriberModel");

beforeEach(() => {
    jest.resetAllMocks();
    req = httpMocks.createRequest();
    res = httpMocks.createResponse();
    next = jest.fn();
    jest.resetAllMocks();
    subscriberModel.findOne = jest.fn();
});
// subscriberService.findByUserId = jest.fn();
const subscriberResponse = {
    id: 1,
    name: 'Sandun',
    msisdn: '94704377575',
    otp: '1234',
    deleted: 0,
    attempts: 0,
    img_url: 'https://'
}
jest.mock('../src/models/subscriber/subscriberModel', () => () => {
  const SequelizeMock = require("sequelize-mock");
  let dbMock = new SequelizeMock();
  let subscriberMock = dbMock.define('subscribers',  {
    id: 1,
    name: 'Sandun',
    msisdn: '94704377575',
    otp: '1234',
    deleted: 0,
    attempts: 0,
    img_url: 'https://'
  });
  let groupMock = dbMock.define('winner', {});
  subscriberMock.belongsTo(groupMock);
  subscriberMock.hasMany();
});

// This test shows how the constructor can be mocked, and how to spy on passed parameters.
describe("Test SubscriberController", () => {
    it("Test getsubscriber", async () => {
        req.userId = 1;
        jest.spyOn(subscriberService, "findByUserId").mockReturnValue(subscriberResponse);
        await subscriberController.getSubscriber(req, res);
        expect(res.statusCode).toBe(200);
    });
});

0 个答案:

没有答案