如何使用express,sequelize,mocha和supertest进行回滚单元测试

时间:2014-11-27 16:19:52

标签: node.js express mocha sequelize.js supertest

我正在尝试将数据插入数据库,使用supertest测试请求,然后使用虚假数据进行回滚。 有人知道这种方式是否正确?如果不是,请你回答并告诉我哪种方法正确? 提前致谢。

...

var app = express();
var request = require('supertest');
var assert = require("assert");
var db = require('../../models');
var mysql = require('mysql');

describe('[Test controller - send_confirmation_email.js]', function () {

    describe('POST /crowdfunding/sendConfirmationEmail', function () {

        it('Second post test with data', function (done) {

            db.sequelize.transaction(function (t) {

                var cf = db.Crowdfunding.build({
                    money_raised: 80,
                    project_id: 999,
                    country: 'germany',
                    type: 'SONG',
                    state: 'PENDING'
                });

                cf.save({ transaction: t }).success(function (cf) {

                    request(app)
                    .post('/crowdfunding/sendConfirmationEmail')
                    .send({
                        'id': cf.id,
                        'text': 'test text'
                    })
                    // .expect(500)
                    .end(function (err, res) {
                        assert.equal('PENDING', cf.state);    
                        t.rollback();
                        done();
                    });                        

                }).error(function () { });

            });    
        });    
    });    
});

1 个答案:

答案 0 :(得分:1)

看起来你的想法是正确的,但是围绕交易的控制流时间是不对的。这里有一些提示。

  • 将事务设置移至before处理程序并使用done回调,并且在done回调内部之前不要调用cf.save().success(。这将确保在开始测试逻辑之前保存事务。
  • t.rollback();移至after处理程序,否则交易将在您的测试请求发送之前回滚。
  • 不要忘记声明请求成功且没有错误和200级状态代码