【问题标题】:Mocha tests, clean disk database before every file runsMocha 测试,在每个文件运行之前清理磁盘数据库
【发布时间】:2018-12-05 18:33:44
【问题描述】:

我正在使用 Sails 1.x。

是否可以在每个测试文件运行之前重置 Sails.js 数据库?我希望它在每次运行之前 sails.lift() 完成后处于状态。我关注了这里的文档 - https://sailsjs.com/documentation/concepts/testing - 但最终没有得到任何这样的解决方案。

我现在唯一的解决方案是将 lifecyle.test.js beforeafter 更改为运行 beforeEveryafterEvery - https://sailsjs.com/documentation/concepts/testing - 所以每次测试前都会提升。但是需要很长时间才能解除。

【问题讨论】:

    标签: unit-testing testing sails.js integration-testing


    【解决方案1】:

    这很简单。您只需要指定在数据源的连接中添加测试连接(取决于 Sails.js 的版本),在测试期间将其设置为活动状态并提供迁移策略'drop',它只是在每次启动时重建您的数据库

    models: {
        connection: 'test',
        migrate: 'drop'
    },
    

    我的连接 Sails.js 0.12.14

    module.exports.connections = {
      prod: {
        adapter: 'sails-mongo',
        host: 'localhost',
        port: 27017,
        database: 'some-db'
      },
    
      test: {
        adapter: 'sails-memory'
      },
    };
    

    我的简化生命周期.test.js

    let app;
    // Before running any tests...
    before(function(done) {
        // Lift Sails and start the server
        const Sails = require('sails').constructor;
    
        const sailsApp = new Sails();
        sailsApp.lift({
            models: {
                connection: 'test',
                migrate: 'drop'
            },
        }, function(err, sails) {
            app = sails;
            return done(err, sails);
        });
    });
    
    // After all tests have finished...
    after(async function() {
        // here you can clear fixtures, etc.
        // (e.g. you might want to destroy the records you created above)
    
        try {
            await app.lower()
        } catch (err) {
            await app.lower()
        }
    });
    

    在 Sails 1 中更简单

    const sails = require('sails');
    
    before((done) => {
      sails.lift({
        datastores: {
          default: {
            adapter: 'sails-memory'
          },
        },
        hooks: { grunt: false },
        models: {
          migrate: 'drop'
        },
      }, (err) => {
        if (err) { return done(err); }
    
        return done();
      });
    });
    
    after(async () => {
    
      await sails.lower();
    
    });
    

    【讨论】:

    • 非常感谢您的关注。不过我不明白,你是在每次测试之前/之后升降吗?这不是过分吗?
    • 你也知道如何在测试中使用 Cloud SDK 吗?我和另一个用户遇到了这个问题 - stackoverflow.com/q/53462491/1828637
    • @Noitidart 坦率地说,我没有直接使用 Cloud SDK,但我的同事使用它。你绝对应该通过自定义构建步骤来做到这一点cloud.google.com/cloud-build/docs/create-custom-build-steps我猜它看起来像prntscr.com/ls8o93
    • @Noitidart here is 也是 Sails.js 单元测试的基础,但它适用于 Sails.js 0.12.14-
    • @Noitidart 关于beforebeforeEvery,实际上它在official docs 中称为beforeEach,我认为我们不应该改变它,因为我们不需要reliift每次我们的应用程序,因为它会花费额外的 500 毫秒,而单元测试应该很快,当我们可以在后续测试中运行所有这些操作测试时,我们在测试 CRUD 期间将受到更多限制。这只是我的恕我直言,所以也许我错了。
    【解决方案2】:

    我在我的引导测试文件中使用它来清理数据库。

    const sails = require('sails');
    
    before((done) => {
      sails.lift({
        log: {
          level: 'silent'
        },
        datastores: {
          default: {
            adapter: 'sails-disk',
            inMemoryOnly: true
          }
        },
        models: {
          migrate: 'drop',
          archiveModelIdentity: false
        }
      }, function (err, sails) {
        if (err) return done(err);
          done(err, sails);
      });
    });
    
    after(async () => {
      await sails.lower();
    });
    
    beforeEach((done) => {
      sails.once('hook:orm:reloaded', done);
      sails.emit('hook:orm:reload');
    });
    

    【讨论】:

    • 感谢分享安!在每个测试套件之后提升需要很长时间,对吧?我最终只是通过为每个模型调用 MODEL.destroy({}); 来手动清理所有数据。
    • 就运行时间而言,提升每个测试套件对我来说并不明显(也许我的测试不够大?)。
    • 我的电梯需要 30 秒。
    猜你喜欢
    • 2013-04-25
    • 2017-06-14
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多