使用PostgreSQL.
我正在尝试为API设置适当的测试套件.到目前为止它可以工作,但测试是直接在主数据库上完成的.然后,我必须删除我的测试创建的所有内容,或者在这种情况下编辑.
我知道这是一件坏事(因为我可以忘记恢复变化,或搞乱序列).所以我想创建一个具有相同结构和基础数据的测试数据库,然后将其删除.这种方法在这种情况下是一个好的方法吗?
如果我想这样做,我应该怎么做?NodeJS中有没有办法执行SQL脚本?我尝试使用shell脚本,但到目前为止它已经完全混乱了权限,所以我认为使用NodeJS会更容易.
我正在使用Mocha进行测试.
我建议一个单独的测试数据库.它可以很轻,你会想知道那里的数据(所以你可以测试它!).可以处理所有业务规则的基础数据集可以导出为SQL文件(或某种导出方法).
通常,您的应用程序将与数据库建立连接,并且您的测试框架将有一些方法在测试开始之前运行方法.您可以在此指定测试数据库.您的数据库访问对象(DAO)或脚本,方法将以某种方式利用主连接,可以是方法参数,也可以是require语句等.
例如,我正在使用knex模块连接到数据库并构建查询.我初始化并引用我们的文档中指定的单个数据库连接.
var Knex = require( 'knex' ); Knex.knex = Knex.initialize( { client : 'mysql', connection : { host : 'my.domain.com', user : 'dbrole', password : 'password', database : 'productiondb', charset : 'utf8' } } );
我的DAO得到这样的连接:
var knex = require('knex').knex;
现在在我的单元测试中,在运行测试套件之前,我可以将我的连接设置为测试DB
var Knex = require( 'knex' ); Knex.knex = Knex.initialize( { client : 'mysql', connection : { host : '127.0.0.1', user : 'root', password : 'root', database : 'testdb', charset : 'utf8' } } );
你有它!在测试和生产中使用完全相同的代码,并且您的生产数据库与测试分离.这种模式可以与很多框架一起使用,因此你必须适应(并且如果他们正在测试数据库,则清理测试,可能在所有测试完成后恢复到默认值).
编辑:顺便说一句,knex与postgre一起使用,是一种在纯节点JS中构建查询的有趣方式.它还可以执行原始SQL.