如何在玩笑中模拟链式全局对象

问题描述 投票:0回答:1

我正在尝试模拟数据库调用,但由于某种原因它不起作用。如果我删除 .lean() 它的工作发现。

我如何嘲笑这个精益()

下面是我的代码

服务.js

function getStoreData(storeId, callback) {
    global.models.Config.TransactionCashmgmtConfigModel.findOne({ storeId: storeId }).lean().exec((err, doc) => {
        if (!doc || err) {
            console.error('Error fetching document:', err);
            return callback(err, false);
        }

        console.log('Document found:', doc);
        return callback(null, true);
    });
}

测试.js

global.models = {
    Config: {
        TransactionCashmgmtConfigModel: {
            findOne: jest.fn()
        },
    },
};

 describe('getStoreData', () => {
        it('should return store data', () => {
      
const mockData = {storeId: '1234', enabled: true};

            global.models.Config.TransactionCashmgmtConfigModel.findOne.mockImplementation(() => {
                return {
                    exec: (callback) => {
                        callback(null, mockData);
                    },
                };
            });

            getStoreData('1234', (err, data) => {
                expect(data).toEqual(mockData)
            });
        });
    });
node.js jestjs
1个回答
0
投票
  1. 您可以使用 mockFn.mockReturnThis() 来模拟链式方法调用。

  2. 从测试的断言可以看出,应该是

    callback(null, doc)
    ,而不是
    callback(null, true)

  3. 您忘记调用

    done()
    ,请参阅asynchronous#callbacks

例如

service.js

function getStoreData(storeId, callback) {
  global.models.Config.TransactionCashmgmtConfigModel.findOne({ storeId: storeId })
    .lean()
    .exec((err, doc) => {
      if (!doc || err) {
        console.error('Error fetching document:', err);
        return callback(err, false);
      }
      console.log('Document found:', doc);
      return callback(null, doc);
    });
}

module.exports = getStoreData;

service.test.js

const getStoreData = require('./service');

describe('getStoreData', () => {
  it('should return store data', (done) => {
    const mockData = { storeId: '1234', enabled: true };

    global.models = {
      Config: {
        TransactionCashmgmtConfigModel: {
          findOne: jest.fn().mockReturnThis(),
          lean: jest.fn().mockReturnThis(),
          exec: jest.fn().mockImplementation((callback) => {
            callback(null, mockData);
          }),
        },
      },
    };

    getStoreData('1234', (err, data) => {
      expect(data).toEqual(mockData);
      done();
    });
  });
});

测试结果:

  console.log
    Document found: { storeId: '1234', enabled: true }

      at log (stackoverflow/78278897/service.js:9:15)

 PASS  stackoverflow/78278897/service.test.js
  getStoreData
    √ should return store data (18 ms)                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                         
Test Suites: 1 passed, 1 total                                                                                                                                                                                                                           
Tests:       1 passed, 1 total                                                                                                                                                                                                                           
Snapshots:   0 total
Time:        0.753 s, estimated 7 s
Ran all test suites related to changed files.
© www.soinside.com 2019 - 2024. All rights reserved.