我有一个猫鼬模式-WishlistItem
,它具有验证:如果具有WishlistItem
属性(对象ID),则无法创建新的wishlist
不属于数据库中实际存在的Wishlist
。 WishlistItem
具有此验证,因此不会将没有父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
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;
答案 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');
});
});
});