【发布时间】:2013-04-25 12:41:09
【问题描述】:
在运行测试套件之前清理数据库的最佳方法是什么(是否有 npm 库或推荐的方法)。
我知道 before() 函数。
我正在使用 node/express、mocha 和 sequelize。
【问题讨论】:
标签: node.js express mocha.js sequelize.js
在运行测试套件之前清理数据库的最佳方法是什么(是否有 npm 库或推荐的方法)。
我知道 before() 函数。
我正在使用 node/express、mocha 和 sequelize。
【问题讨论】:
标签: node.js express mocha.js sequelize.js
我制作了这个库来为您的测试清理和导入固定装置。
这样,您可以导入夹具、测试然后清理您的数据库。
看看以下内容:
before(function (done) {
prepare.start(['people'], function () {
done();
});
});
after(function () {
prepare.end();
});
【讨论】:
我通常这样做(比如User 模型):
describe('User', function() {
before(function(done) {
User.sync({ force : true }) // drops table and re-creates it
.success(function() {
done(null);
})
.error(function(error) {
done(error);
});
});
describe('#create', function() {
...
});
});
还有sequelize.sync({force: true}) 将删除并重新创建所有表(.sync() 描述为here)。
【讨论】:
before(() => User.sync({ force : true })) 现在应该也能正常工作(如果这就是你所说的“现代方法”:D)
before(以及beforeEach)可以应用于每组测试,因此您可以在每次测试(一组测试)之前启动事务并提交或之后回滚(使用after 或afterEach)。 Mocha 作为测试运行器根本不处理数据库,所以它不是内置功能。
before 函数与清理数据库一样好。如果您只需要清理一次数据库,即在运行所有测试之前,您可以在单独的文件中使用全局 before 函数
before(function(done) {
// remove database data here
done()
})
require('./globalBefore)
// actual test 1 here
require('./globalBefore)
// actual test 2 here
请注意,globalBefore 只会运行一次,即使它已被要求两次
尽量限制在测试中使用外部依赖项,例如数据库。外部依赖越少,测试就越容易。您希望能够并行运行所有单元测试,而数据库等共享资源使这变得困难。
看看这个关于编写可测试 javascript 的 Google 技术讲座 http://www.youtube.com/watch?v=JjqKQ8ezwKQ
还可以查看rewire 模块。它非常适合用于存根函数。
【讨论】: