删除整个 sails-memory 数据库?

10

我正在使用“ sails-memory”作为我的Sails单元测试的数据库,理想情况下,我希望在每个测试后清除整个数据库。是否有一种方法可以删除整个数据库?


这篇文章对我非常有用,提供了解决内存和实际SQL数据库两种情况的方案:https://www.ultrasaurus.com/2016/06/sailsjs-testing-patterns-trunctate-database/. - Tomty
2个回答

7
我找到了另一种似乎可行的方法。这会发出一个事件,告诉orm hook在每个测试之前重新加载。如果使用内存数据库或磁盘数据库并使用“drop”迁移选项,则可以实现所需功能。
beforeEach((done) => {
  "use strict";
  // Drops database between each test.  This works because we use
  // the memory database
  sails.once('hook:orm:reloaded', done);
  sails.emit('hook:orm:reload');
});

我认为这也适用于其他数据库。可以与mongodb一起使用。 - paulodiovani

3

在每次测试之前,您可以提起应用程序的 sails,并重新构建数据库(migrate: 'drop')。以下是一个示例:

Sails = require('sails/lib/app');
app = Sails();

var testConfig = {
    environment: 'test',
    port: 1337,
    log: {
        level: 'error'
    },
    connections: {
        testDB: {
            adapter: 'sails-memory'
        }
    },
    connection: 'testDB',

    //wipe/drop ALL my data and rebuild models every time
    migrate: 'drop'
};

beforeEach(function (done) {
    // start sails app for tests
    app.lift(testConfig, function (err, sails) {
        done(err);
    });
});

//tests...

2
不需要运行“migrate: drop”命令;内存适配器每次都会从头开始! - sgress454
我一直在想这个问题——提升操作的成本有多高?目前我只有几个测试,但随着测试数量的增加,我想知道额外开销是否会导致测试套件运行缓慢。你有什么经验吗?谢谢! - HolySamosa
只有在我的集成测试中,我才会在每个测试之前启动服务器。此外,我还有一些单元测试,在这些测试中,我使用sinon来模拟数据库访问。在我的单元测试中,我在所有测试之前启动服务器,只是为了初始化模型、服务等。以下是数字:136个集成测试=>约8秒;201个单元测试=>约3秒。 - Victor
2
值得注意的是 - 我不知道这是否是最近的更改或特殊情况 - 但在我的配置中,我必须将 connectionmigrate 键放置在配置的 models 对象内才能使其正常工作,像这样:testConfig = { models: { connection: 'testDB', migrate: 'drop' }, ... }。如果上述方法不起作用,请尝试这个。 - user677526

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接