在NodeJS中testing与数据库相关的代码

使用PostgreSQL。

我正在尝试为API设置适当的testing套件。 到目前为止,它的工作原理是直接在主数据库上完成testing。 然后我必须删除我的testing创build的一切,或在这种情况下编辑。

我知道这是一件坏事(因为我可以忘记恢复一个变化,或弄乱序列)。 所以我想创build一个具有相同结构和基础数据的testing数据库,然后删除它。 在这种情况下,这种方法是否合适?

如果我想这样做,我该怎么办? 在NodeJS中有执行SQL脚本的方法吗? 我尝试了一个shell脚本,但到目前为止,这个权限已经完全混乱了,所以我认为直接使用NodeJS会更容易一些。

我正在使用Mocha进行testing。

我会build议一个单独的testing数据库。 它可以很轻,你会想知道那里的数据(所以你可以testing它!)。 可以处理所有业务规则的基础数据集可以导出为SQL文件(或某种导出方法)。

通常,您的应用程序将与数据库build立连接,并且在testing开始之前,您的testing框架将有一些方法来运行方法。 在这里你指定了testing数据库。 您的数据库访问对象(DAO)或脚本,方法将以某种方式使用主连接,无论是作为方法参数还是要求语句等。

作为一个例子,我使用knex模块连接到数据库并构build查询。 我初始化并引用我的单个数据库连接,如他们的文档中指定的 。

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; 

现在在我的unit testing中,在testing套件运行之前,我可以将连接设置为testing数据库

 var Knex = require( 'knex' ); Knex.knex = Knex.initialize( { client : 'mysql', connection : { host : '127.0.0.1', user : 'root', password : 'root', database : 'testdb', charset : 'utf8' } } ); 

在那里,你有它! 在testing和生产中使用完全相同的代码,并将生产数据库从testing中分离出来。 这个模式可以和很多框架一起工作,所以你必须适应(如果testing数据库正在枯竭,那么清理你的testing,也许在所有的testing完成后恢复到默认状态)。

编辑:顺便说一下,knex与postgre工作,是一个有趣的方式来build立在纯节点JS查询。 它也可以执行原始SQL。