簡體   English   中英

如何使用Express,Sequelize,Mocha和SuperTest進行回滾的單元測試

[英]Howto make a unit test with rollback using express, sequelize, mocha and supertests

我正在嘗試進行將數據插入數據庫的測試,使用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回調的before處理程序中,直到在cf.save().success(回調內部cf.save().success(才調用done 。這將確保在開始測試邏輯之前完成事務的保存。
  • 移動t.rollback(); after發送測試請求之前處理程序或該交易將回滾。
  • 不要忘記斷言請求成功,沒有錯誤,並顯示200級狀態代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM