Sinon用Sequelize嘲笑

时间:2016-11-07 12:13:27

标签: node.js unit-testing sequelize.js sinon

我有使用Sequelize的以下nodejs函数:

var processDatabase = function (dbConnection, schema, recordsets) {

    var myLogTable = dbConnection.define(schema.tableName, schema.myLogSchema, schema.myLogSchemaIndex);
    myLogTable.sync({

        force: false,
        freezeTableName: true,
        logging: console.log

    }).then(function () {

        console.log('Table synced...');

        for (k = 0; k < recordsets.length; k++) {

            var query = "Some query";

            dbConnection.query(
                    query, {
                        type: dbConnection.QueryTypes.SELECT
                    }
                )
                .then(function (results) {
                    console.log('MYSQL Selection Done');
                })
                .catch(function (err) {
                    console.log('MYSQL Error: ' + err.message);
                });
        }
    }).catch(function (err) {
        console.log('MYSQL Sync Error: ' + err.message);
    });
};

我是嘲笑的新手,并不特别知道如何测试捕获部分。

这是我可以提出的单元测试,但我不知道同步调用如何进入catch部分:

describe('when call processDatabase', function () {

    it('should process successfully when sync fails', function (done) {

        seqConnection.define = function (tableName, schema, schemaIndex) {
            return mockMyLogModel;
        };

        processProfilesNotMapped(seqConnection, {
                        tableName: 'SomeTable',
                        myLogSchema: myLogSchema,
                        myLogSchemaIndex: myLogSchemaIndex
                    }, []);
        done();         
    })
});

我如何编写我的模拟,以便我可以测试两个捕获,然后它们可以被覆盖?

1 个答案:

答案 0 :(得分:1)

您需要在模拟中推迟例外,因为“同步”正在使用承诺。您可以使用q库或任何其他。这样,当您执行同步功能时,它将转到捕获部分
使用q的例子:

describe('when call processDatabase', function () {

    it('should process successfully when sync fails', function (done) {

        seqConnection.define = function (tableName, schema, schemaIndex) {
            const mock = {
                sync: function(){
                   const deferred = q.defer();
                   deferred.reject(new Error('Some error'));
                   return deferred.promise;
                }
            }
            return mock;
        };

    expect(
        function(){
            cmdManager.execute("getProfileDummy","hosar@gmail.com")
        }
    ).to.throw(Error);

        processProfilesNotMapped(seqConnection, {
                        tableName: 'SomeTable',
                        myLogSchema: myLogSchema,
                        myLogSchemaIndex: myLogSchemaIndex
                    }, []);
        done();         
    })
});