mongodb - 使用 Jest 测试具有数据库调用的函数

标签 mongodb mongoose jestjs

我是 Jest 和一般代码测试的新手。我想测试一个使用 mongoose 从 mongodb 数据库中检索数据的函数。当我运行测试时,我正在测试的函数内对数据库的所有调用都返回 null。测试需要从数据库检索数据的函数的推荐方法是什么?

如果您需要代码示例或更多信息,请告诉我。

更新:

这是我的代码:

代码.js

...
function buildText(listing, messageRule, reservation, isReview = false, isLastMinuteMessage = false) {
    return new Promise(async function(resolve) {
        const name = reservation.name;
        try {
            message = await Message.findOne({
                listingID: listing._id,
                messageRuleID: messageRule._id,
                reservationID: reservation._id,
                message: {$exists: true}
            });
        } catch (error) {
            console.error(error);
        }
        if (message) {
            text = message.message;
        } else {
            text = messageRule.message;
            if (isLastMinuteMessage) {
                text = messageRule.lastMinuteMessage;
            }
        }
        text = text.replace(/{{Guest Name}}/g, name);
        resolve(text);
    });
}
...

代码.test.js

const Code = require("./code");
describe("funcs", () => {
    it("buildText", async () => {
        let listing = {
            _id: "1324",
            pricingEnabled: true,
            listingFound: true,
            hideListing: null
        };
        let messageRule = {
            _id: "3452345",
            minNights: 1,
            reviewEnabled: false,
            disableMessageAfterReview: false,
            message: 'test',
            lastMinuteMessage: 'test2'
        };
        let reservation = {
            _id: "63452345",
            hasLeftReview: true,
            hasIssues: false
        };
        let isReview = false;
        let isLastMinuteMessage = false;
        let response = await Code.buildText(listing, messageRule, reservation, isReview, isLastMinuteMessage);
        expect(response).toMatchSnapshot();
    });
});

我遇到的问题是代码文件中的 message = await Message.findOne({ 行。它总是返回 null 但我需要能够告诉它返回 true 或false。我该怎么做?

最佳答案

这是一个基于所提供代码的简单工作示例:


代码.js

const { Message } = require('./message');

function buildText(listing, messageRule, reservation, isReview = false, isLastMinuteMessage = false) {
  return new Promise(async function (resolve) {
    let message, text;
    const name = reservation.name;
    try {
      message = await Message.findOne({
        listingID: listing._id,
        messageRuleID: messageRule._id,
        reservationID: reservation._id,
        message: { $exists: true }
      });
    } catch (error) {
      console.error(error);
    }
    if (message) {
      text = message.message;
    } else {
      text = messageRule.message;
      if (isLastMinuteMessage) {
        text = messageRule.lastMinuteMessage;
      }
    }
    text = text.replace(/{{Guest Name}}/g, name);
    resolve(text);
  });
}

module.exports = {
  buildText
}

代码.test.js

const Code = require('./code');
const { Message } = require('./message');

describe("funcs", () => {
  it("buildText", async () => {
    const mock = jest.spyOn(Message, 'findOne');  // spy on Message.findOne()
    mock.mockImplementation(() => Promise.resolve({
      message: 'the message'
    }));  // replace the implementation

    let listing = {
      _id: "1324",
      pricingEnabled: true,
      listingFound: true,
      hideListing: null
    };
    let messageRule = {
      _id: "3452345",
      minNights: 1,
      reviewEnabled: false,
      disableMessageAfterReview: false,
      message: 'test',
      lastMinuteMessage: 'test2'
    };
    let reservation = {
      _id: "63452345",
      hasLeftReview: true,
      hasIssues: false
    };
    let isReview = false;
    let isLastMinuteMessage = false;
    let response = await Code.buildText(listing, messageRule, reservation, isReview, isLastMinuteMessage);
    expect(response).toMatchSnapshot();

    mock.mockRestore();  // restore Message.findOne()
  });
});

message.js(示例的虚拟模型)

const mongoose = require('mongoose');

exports.Message = mongoose.model('Message', new mongoose.Schema({ }));

关于mongodb - 使用 Jest 测试具有数据库调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211280/

相关文章:

javascript - 在数据库中存储表单架构和函数

vue.js - 如何在 stub 中触发事件? [vue-test-utils]

javascript - 如何在 redux 操作(或操作中分配的其他回调)的上下文中使用 jest 测试 `image.onload`

javascript - meteor 服务器: ReferenceError: calcMD5 is not defined

node.js - 如何根据常见的数组元素对文档进行匹配和排序

javascript - 为什么 MongoDB 中的所有对象 ID 都以数字 5 开头?

javascript - Mongoose 在使用 import 语法时未定义,而在使用 require 时未定义

node.js - REST API 中不同方法的良好实践

node.js - Mongoose.js 忽略子文档架构中的默认值

javascript - 如何对 Vue 应用程序中的嵌套操作进行单元测试?