簡體   English   中英

用 Jest 和 sequelize-mock 模擬 sequelize

[英]Mock sequelize with Jest and sequelize-mock

我正在構建一個新項目,我正在嘗試使用 TDD 作為我的默認方法,並嘗試將它與集成測試一起應用。

事情很簡單,我想從我的數據庫中檢索所有用戶。

//controller.js
const UserService = require('../services/user');

module.exports = {
  // corresponds to /users
  getAllUsers: async (req, res, next) => {
    const users = await UserService.fetchAllUsers();
    res.send(users);
  },
};
const models = require('../database/models/index'); // I tried also with destructuring

module.exports = {
  fetchAllUsers: async () => models.user.findAll(),
};

我的實際測試文件看起來像

const request = require('supertest');

const SequelizeMock = require('sequelize-mock');
const app = require('..');

const dbMock = new SequelizeMock();
const models = require('../src/database/models/index');

jest.mock('../src/database/models/index', () => ({
  user: jest.fn(),
}));

models.user.mockImplementation(() => {
  const UserMock = dbMock.define('user', {});
  UserMock.$queueResult(UserMock.build({
    username: 'username',
    mail: 'myMail@myMail.com',
  }));
  return UserMock;
});

describe('Demo test', () => {
  it('should respond to users route', (done) => {
    request(app)
      .get('/users')
      .end((err, res) => {
        expect(err).toBeNull();
        expect(res.status).toBe(200);
        expect(res.json).toBe('object');
        done();
      });
  });
});


所有這些實際上都是有效的,但是當我試圖模擬用戶時,我TypeError: models.user.findAll is not a function

我需要用 UserMock 的值替換 model.user 。

有沒有辦法做到這一點? 或者我應該像這樣模擬 findAll

jest.mock('../src/database/models/index', () => ({
  user: () => ({ findAll: jest.fn() }),
}));

``

在這種情況下,我不是我想要的 mocking。

如果您想模擬模型,您需要做的就是使用SpyOn類的

const { sequelize, Report, User } = require('../../database/models/index');


describe("my test", () => {
    it("should just mock", () => {
        jest.SpyOn(Report, "count").mockResolvedOnce(6);
    })
})

如果您需要模擬您的服務

首先創建 jest 函數以允許從模擬的 scope 外部訪問,然后使用“雙 class 調用”模擬它

const BaseService = require('../BaseService'); 常量 mockFecthOne = jest.fn();


jest.mock('../BaseService',
  () => jest.fn().mockImplementation(
    () => ({
      fetchOne: mockFetchOne,
    }),
  ));

// inside your test just

BaseService().fetchOne.mockResolvedOnce({....})

這就是它希望它的工作原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM