首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sequelize in-memory sqlite tests db?

Sequelize in-memory sqlite tests db?
EN

Stack Overflow用户
提问于 2020-09-21 11:10:26
回答 1查看 1.1K关注 0票数 2

我有以下测试,我试图在sqlite内存数据库上测试我的db模型。

代码语言:javascript
复制
describe(`task model`, () => {
  let Task, sandbox;
  beforeEach(() => (sandbox = createSandbox()));
  afterEach(() => sandbox.restore());
  beforeEach(async () => {
    const dbConnection = new Sequelize(`sqlite::memory:`, { logging: false });
    stub(dbConnectionModule, `dbConnection`).value(dbConnection);
    Task = require(`./models/task.js`).Task;
    await dbConnection.sync({ force: true });
  });
  describe(`create a task`, () => {
    let task;
    beforeEach(async () => {
      task = Task.build(taskData);
      await task.save();
    });
    it(`gets an id`, () => expect(task.id).to.not.be.empty);
    it(`shows up with a find all`, async () => {
      const tasks = await Task.findAll();
      expect(tasks).to.have.length(1);
    });
  });
});

我可以验证连接已经new了两次,但是我的第二个测试令人困惑地返回创建了两个任务。

它似乎使用了与第一个测试相同的数据库!

我的印象是,每次为sqlite的内存db调用Sequelize构造函数时,我都会得到一个新的内存db,我是不是误解了什么?

或者,我如何删除并为新测试完全重新创建数据库?

令人惊讶的是,即使在同步之后,下面的代码似乎也不起作用

代码语言:javascript
复制
    for (const model of Object.values(dbConnection.models))
      model.destroy({ truncate: true });
EN

回答 1

Stack Overflow用户

发布于 2021-09-28 17:31:28

嗨,

我所做的是替换索引文件中的数据库,而不是测试中的数据库。

代码语言:javascript
复制
models/index.js
...

const sequelize = require('sequelize')

let sequelize;
if(process.env.NODE_ENV === 'test') {
    sequelize = new Sequelize('sqlite::memory:');
}
...

在您的测试中,只需像往常一样导入

代码语言:javascript
复制
const { Task } = require('./models/index.js');
describe(`task model`, () => {
  beforeEach(() => (sandbox = createSandbox()));
  describe(`create a task`, () => {
    let task;
    beforeEach(async () => {
      task = Task.build(taskData);
      await task.save();
    });
    it(`gets an id`, () => expect(task.id).to.not.be.empty);
    it(`shows up with a find all`, async () => {
      const tasks = await Task.findAll();
      expect(tasks).to.have.length(1);
    });
  });
});

您必须/应该实现一个解决方案,以便在执行的每个测试中初始化数据库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63985693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档