Node.js 如何使用express、sequelize、mocha和supertests进行回滚单元测试

Node.js 如何使用express、sequelize、mocha和supertests进行回滚单元测试,node.js,express,mocha.js,sequelize.js,supertest,Node.js,Express,Mocha.js,Sequelize.js,Supertest,我试图做一个将数据插入数据库的测试,用supertest测试一个请求,然后用假数据进行回滚。 有人知道这种方法是否正确吗?如果不是,请你回答并告诉我哪条路正确? 提前谢谢 ... var app = express(); var request = require('supertest'); var assert = require("assert"); var db = require('../../models'); var mysql = require('mysql'); descr

我试图做一个将数据插入数据库的测试,用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 () { });

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

看起来您的想法是正确的,但是围绕事务的控制流计时是不正确的。这里有一些提示

  • 使用
    done
    回调将事务设置移动到
    之前的
    处理程序,在
    cf.save().success(
    回调)内之前不要调用
    done
    。这将确保在启动测试逻辑之前完成事务的保存
  • t.rollback();
    移动到
    处理程序之后的
    ,否则事务将在发送测试请求之前回滚
  • 不要忘记声明请求成功,没有错误,状态代码为200级

谢谢,这非常清楚。现在的问题是,当我处理请求的控制器找不到数据时,因为它只存在于事务中……不知道如何解决这个问题。只需在“之前”中保存它,并在“之后”中删除它即可