测试具有依赖于另一个模式的验证的猫鼬模式

时间:2020-11-02 03:09:25

标签: node.js mongodb mongoose mocha chai

我有一个猫鼬模式-WishlistItem,它具有验证:如果具有WishlistItem属性(对象ID),则无法创建新的wishlist不属于数据库中实际存在的WishlistWishlistItem具有此验证,因此不会将没有父wishlistItems的{​​{1}}意外添加到数据库中。

如何在不创建真实的wishlists的情况下在WishlistItem模型上运行测试?

我正在使用摩卡咖啡和柴。

创建愿望清单项目的测试

目前该测试给出: wishlist

这是因为AssertionError: expected undefined to be an object.引发错误:

await WishlistItem.create({...,因为我们数据库中没有该ValidationError: WishlistItem validation failed: wishlist: Invalid WishlistItem "wishlist" property. No wishlist found with id: 5f9480a69c4fcdc78d55397d

wishlist

WishlistItem架构

const chai = require('chai');
const mongoose = require('mongoose');


const { expect } = chai;

const dbConnect = async (dsn) =>
  mongoose.connect(dsn, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useFindAndModify: false,
  });

const should = chai.should();
const WishlistItem = require('../testsFiles/WishlistItem.Model');

describe('Wishlist Item', () => {
  before(async () => {
    dbConnect(`mongodb://127.0.0.1:27017/schemaDepTest`);
  });
  context('create wishlist item', () => {
    it('should create a wishlist item with valid arguments', async function () {
      let wishlist;
      try {
        wishlist = await WishlistItem.create({
          itemName: 'Purse',
          price: '5.00',
          wishlist: mongoose.Types.ObjectId('5f9480a69c4fcdc78d55397d'),
        });
      } catch (err) {
        console.log(err);
      }
      expect(wishlist).to.be.an('Object');
    });
  });
});

愿望清单模式

const mongoose = require('mongoose');

const itemSchema = new mongoose.Schema(
  {
    itemName: { type: String, required: true, trim: true },
    price: { type: String, required: true, trim: true },
    wishlist: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Wishlist',
      required: true,
    },
  },
  { timestamps: { createdAt: 'created_at' } }
);

itemSchema.path('wishlist').validate(async function (value) {
  const WishlistModel = require('./Wishlist.Model');
  const wishlist = await WishlistModel.findOne({ _id: value });
  if (!wishlist) {
    throw new Error(
      `Invalid WishlistItem "wishlist" property. No wishlist found with id: ${value}`
    );
  } else {
    return true;
  }
}, 'Parent Wishlist non existent');

const WishlistItem = mongoose.model('WishlistItem', itemSchema);
module.exports = WishlistItem;

1 个答案:

答案 0 :(得分:0)

This post answered my question

我只需要添加 sinon.stub(Object.getPrototypeOf(Wishlist), 'findOne').callsFake(() => 'mock');

这样,当WishlistItem试图通过调用Wishlist来验证Wishlist.findOne存在时,() => 'mock'会被替换为findOne。 >

完整的测试代码:

const sinon = require('sinon');
const chai = require('chai');
const mongoose = require('mongoose');

const { expect } = chai;

const dbConnect = async (dsn) =>
  mongoose.connect(dsn, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useFindAndModify: false,
  });

const should = chai.should();
const WishlistItem = require('../testsFiles/WishlistItem.Model');
const Wishlist = require('../testsFiles/Wishlist.Model');

describe('Wishlist Item: testing dependency mocking ', () => {
  before(async () => {
    dbConnect(`mongodb://127.0.0.1:27017/schemaDepTest`);
  });
  context('create wishlist item', () => {
    it('should create a wishlist item with valid arguments', async function () {
      sinon.stub(Object.getPrototypeOf(Wishlist), 'findOne').callsFake(() => 'mock');

      let wishlist;
      try {
        wishlist = await WishlistItem.create({
          itemName: 'Purse',
          price: '5.00',
          wishlist: mongoose.Types.ObjectId('5f9480a69c4fcdc78d55397d'),
        });
      } catch (err) {
        console.log(err);
      }
      console.log(wishlist);
      expect(wishlist).to.be.an('Object');
    });
  });
});