在NodeJS中测试数据库相关的代码

时间:2013-12-19 19:41:43

标签: node.js postgresql testing mocha

使用PostgreSQL。

我正在尝试为API设置适当的测试套件。到目前为止它可以工作,但测试是直接在主数据库上完成的。然后,我必须删除我的测试创建的所有内容,或者在这种情况下进行编辑。

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

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

我正在使用Mocha进行测试。

1 个答案:

答案 0 :(得分:6)

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

通常,您的应用程序将与数据库建立连接,并且您的测试框架将有一些方法在测试开始之前运行方法。您可以在此指定测试数据库。您的数据库访问对象(DAO)或脚本,方法将以某种方式利用主连接,可以是方法参数,也可以是require语句等。

例如,我使用knex module连接到数据库并构建查询。我按照their docs中的规定初始化并引用我的单个数据库连接。

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;

现在在我的单元测试中,在运行测试套件之前,我可以将我的连接设置为测试数据库

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。