gpt4 book ai didi

mongodb - JEST 和 MongoDB 的异步问题

转载 作者:行者123 更新时间:2023-12-02 20:13:27 26 4
gpt4 key购买 nike

当我尝试使用 beforeEach() Hook 从 MongoDB 集合中删除项目时,我得到的结果与 JEST 不一致。

我的 Mongoose 架构和模型定义为:

// Define Mongoose wafer sort schema
const waferSchema = new mongoose.Schema({
productType: {
type: String,
required: true,
enum: ['A', 'B'],
},
updated: {
type: Date,
default: Date.now,
index: true,
},
waferId: {
type: String,
required: true,
trim: true,
minlength: 7,
},
sublotId: {
type: String,
required: true,
trim: true,
minlength: 7,
},
}

// Define unique key for the schema
const Wafer = mongoose.model('Wafer', waferSchema);
module.exports.Wafer = Wafer;

我的 JEST 测试:

describe('API: /WT', () => {
// Happy Path for Posting Object
let wtEntry = {};

beforeEach(async () => {
wtEntry = {
productType: 'A',
waferId: 'A01A001.3',
sublotId: 'A01A001.1',
};
await Wafer.deleteMany({});
// I also tried to pass in done and then call done() after the delete
});

describe('GET /:id', () => {
it('Return Wafer Sort Entry with specified ID', async () => {
// Create a new wafer Entry and Save it to the DB
const wafer = new Wafer(wtEntry);
await wafer.save();

const res = await request(apiServer).get(`/WT/${wafer.id}`);
expect(res.status).toBe(200);
expect(res.body).toHaveProperty('productType', 'A');
expect(res.body).toHaveProperty('waferId', 'A01A001.3');
expect(res.body).toHaveProperty('sublotId', 'A01A001.1');
});
}

因此,当我多次运行测试时,我总是遇到的错误与重复的键有关:MongoError:E11000重复 key 错误集合:promis_tests.promiswts索引:waferId_1_sublotId_1 dup key:{:“A01A001.3”,:“A01A001.1”}

但是我不明白如果 beforeEach() 正确触发,我如何得到这个重复的键错误。我是否试图不正确地清除集合?我尝试在每个回调之前传递一个完成元素,并在删除命令之后调用它。我还尝试在 beforeAll()、afterEach() 和 afterAll() 中实现删除,但仍然得到不一致的结果。我对这个很困惑。我可能只是将架构键全部删除,但我想了解 beforeEach() 这里发生了什么。预先感谢您的任何建议。

最佳答案

这可能是因为您实际上并没有使用 mongoose 提供的 Promise API。默认情况下,像 deleteMany() 这样的 Mongoose 函数不会返回 Promise。您必须在函数链末尾调用 .exec() 以返回一个 Promise 例如等待collection.deleteMany({}).exec()。所以你正在陷入竞争状态。 deleteMany() 还接受回调,因此您始终可以将其包装在 Promise 中。我会做这样的事情:

describe('API: /WT', () => {
// Happy Path for Posting Object
const wtEntry = {
productType: 'A',
waferId: 'A01A001.3',
sublotId: 'A01A001.1',
};

beforeEach(async () => {
await Wafer.deleteMany({}).exec();
});

describe('GET /:id', () => {
it('Return Wafer Sort Entry with specified ID', async () => {
expect.assertions(4);
// Create a new wafer Entry and Save it to the DB
const wafer = await Wafer.create(wtEntry);

const res = await request(apiServer).get(`/WT/${wafer.id}`);
expect(res.status).toBe(200);
expect(res.body).toHaveProperty('productType', 'A');
expect(res.body).toHaveProperty('waferId', 'A01A001.3');
expect(res.body).toHaveProperty('sublotId', 'A01A001.1');
});
}

此外,始终期待异步代码的断言 https://jestjs.io/docs/en/asynchronous.html

您可以在此处阅读有关 Mongoose promise 和查询对象的更多信息 https://mongoosejs.com/docs/promises.html

关于mongodb - JEST 和 MongoDB 的异步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52955884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com