【问题标题】:sinon stub is not workingsinon 存根不工作
【发布时间】:2017-05-02 07:56:17
【问题描述】:

我对测试很陌生,而且我似乎没有成功成功地存根一个函数。我正在尝试存根与数据库的连接,但它一直在联系它,而不是使用存根的结果:

函数如下:

var self = module.exports = {
VerifyAuthentication: function (data){      
    var deferred = q.defer()                
    if(typeof(data.email)=='undefined'){
        deferred.reject({data:{},errorcode:"",errormessage:"param 'email' is mandatory in input object"})
    }else{
        if(typeof(data.password)=='undefined'){
            deferred.reject({data:{},errorcode:"",errormessage:"param 'password' is mandatory in input object"})
        }else{
            var SqlString = "select id, mail, password, origin from tbl_user where mail = ?"    
            var param = [data.email]
            self.ExecuteSingleQuery(SqlString, param).then(function(results){   
                if(results.length > 0)
                {
                    if (results[0].password == data.password)
                    {                   
                        deferred.resolve({data:{"sessionId":results[0].id},errorcode:"",errormessage:""})
                    }else{              
                        deferred.reject({data:{},errorcode:"",errormessage:"bad password"})
                    }
                }else{
                    deferred.reject({data:{},errorcode:"",errormessage:"unknown user"})
                }
            })
        }
    }
    return deferred.promise
},
ExecuteSingleQuery: function (queryString, parameters){     
    var deferred = q.defer()        
    var connection = connect()

    connection.query(queryString, parameters, function (error, results, fields){
        if(error){ deferred.reject(error)};     
        deferred.resolve(results)
    });

    return deferred.promise
},

这是测试:

var dbconnection = require('../lib/dbConnection.js') 
describe("VerifyAuthentication", function(){
    it("_Returns DbResult object when user name and password match", function(){
        var expectedResult = {data:{"sessionKey":"b12ac0a5-967e-40f3-8c4d-aac0f98328b2"},errorcode:"",errormessage:""}
        stub = sinon.stub(dbconnection, 'ExecuteSingleQuery').returns(Promise.resolve(expectedResult))
        return dbconnection.VerifyAuthentication({email:"correct@adres.com",password:"gtffr"}).then((result)=>{
            expect(result.data.sessionId).to.not.be.undefined
            expect(result.errorcode).to.not.be.undefined
            expect(result.errormessage).to.not.be.undefined
            stub.restore()                
        })
    })  
})

我总是得到一个错误'未知用户',这是正常的,因为用户确实不在数据库中。但是,我想存根“ExecuteSingleQuery”函数,避免它连接到数据库。

【问题讨论】:

    标签: testing mocha.js sinon stub


    【解决方案1】:

    我已经修复了您的代码中的几个问题,并在下面发布了更正的文件。

    dbConnection.js

    var self = module.exports = {
        VerifyAuthentication: function (data) {
            var deferred = q.defer();
    
            if (typeof (data.email) == 'undefined') {
                deferred.reject({
                    data: {},
                    errorcode: '',
                    errormessage: "param 'email' is mandatory in input object"
                });
            } else {
                if (typeof (data.password) == 'undefined') {
                    deferred.reject({
                        data: {},
                        errorcode: '',
                        errormessage: "param 'password' is mandatory in input object"
                    });
                } else {
                    var SqlString = 'select id, mail, password, origin from tbl_user where mail = ?';
                    var param = [data.email];
    
                    self.ExecuteSingleQuery(SqlString, param).then(function (results) {
                        if (results.length > 0) {
                            if (results[0].password === data.password) {
                                deferred.resolve({
                                    data: {
                                        'sessionId': results[0].id
                                    },
                                    errorcode: '',
                                    errormessage: ''
                                });
                            } else {
                                deferred.reject({
                                    data: {},
                                    errorcode: '',
                                    errormessage: 'bad password'
                                });
                            }
                        } else {
                            deferred.reject({
                                data: {},
                                errorcode: '',
                                errormessage: 'unknown user'
                            });
                        }
                    });
                }
            }
            return deferred.promise;
        },
        ExecuteSingleQuery: function (queryString, parameters) {
            var deferred = q.defer();
            var connection = connect();
    
            connection.query(queryString, parameters, function (error, results, fields) {
                if (error) {
                    deferred.reject(error);
                }
                deferred.resolve(results);
            });
    
            return deferred.promise;
        }
    };
    

    dbConnection.test.js

    describe('VerifyAuthentication', function () {
        it('Returns DbResult object when user name and password match', function () {
            var expectedResult = [{
                id: '123',
                password: 'gtffr'
            }];
    
            const stub = sinon.stub(dbconnection, 'ExecuteSingleQuery').resolves(expectedResult);
    
            return dbconnection.VerifyAuthentication({
                email: 'correct@adres.com',
                password: 'gtffr'
            }).then((result) => {
                expect(result.data.sessionId).to.not.be.undefined;
                expect(result.errorcode).to.not.be.undefined;
                expect(result.errormessage).to.not.be.undefined;
                stub.restore();
            });
        });
    });
    

    我在下面概述了有问题的部分:

    • expectedResult 变量的值类型错误。在里面 self.ExecuteSingleQuery() 实现,您检查长度 > 0 的数组。存根返回的固定结果是对象而不是数组,这就是它返回 未知用户的原因例外
    • 数组应该包含一个具有{ id: 'xxx', password: 'gtffr' } 属性的对象。根据dbconnection.VerifyAuthentication({email:"correct@adres.com",password:"gtffr"}) 调用使用的密码验证密码
    • 最后,我已将存根语句更改为 resolve 而不是 return 如此处所示const stub = sinon.stub(dbconnection, 'ExecuteSingleQuery').resolves(expectedResult); - 这是解决承诺的首选方法

    【讨论】:

    • 谢谢,我现在可以看到我的困惑了。我的预期结果不是我对“ExecuteSingleQuery”的预期,而是对 VerifyAuthentication 的预期。我花了一些时间才看到这个,但多亏了你我才发现。感谢有关“解决”的提示
    猜你喜欢
    • 2017-05-14
    • 2020-11-01
    • 2017-12-09
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2018-05-05
    • 2015-01-18
    相关资源
    最近更新 更多