2016-07-28 58 views
1

使用node-mssql庫從SQL中提取數據。我一直在使用Sinon(寫了大約200次測試);如果把這個圖書館收藏起來,我的頭腦很麻煩。代碼如下所示:如何使用Sinon使用mssql庫對數據庫進行交互存根?

var sql = require('mssql'); 
var conn = new sql.Connection(sqlConfig); // sqlConfig is connection info, defined elsewhere 

conn.connect(function(err) { 
    var req, selectFromTable; 
    if (err != null) { 
    // handle error 
    } 
    req = new sql.Request(conn); 
    selectFromTable = "select * from DW." + table + " where DWCreatedDate >= '" + start + "' and DWCreatedDate <= '" + end + "' "; 
    logger.debug("Selecting with: ", selectFromTable); 
    req.input('statement', sql.NVarChar, selectFromTable); 
    return req.execute('sp_executesql', function(err, results, returnValue, affected) { 
    if (err != null) { 
     // etc. 
    } else { 
     // data processing 
    } 
    }); 
}); 

代碼正常工作。現在我正在爲它寫一個測試。我知道這個圖書館很難測試,所以我拖延了。我最近代碼:

var conn, reqExecute, sqlReqStub; 
sqlReqStub = sinon.stub(); 
sqlReqStub.execute = sinon.stub(); 
sinon.stub(sql, 'Request').returns(sqlReqStub); 
conn = sinon.stub(); 
sinon.stub(sql, 'Connection').returns(conn); 

conn.connect = sinon.stub().callsArgWith(0, null); 

reqExecute = sqlReqStub.execute.withArgs('sp_executesql').onFirstCall().callsArgWith(1, null, { 
    a: 1 
}); 

你的自然傾向,他們會說「好了,用createStubInstance」但是當我使用的是我回來的連接對象(new sql.Connection(config))有TediousRequest(什麼庫默認爲當它建立了連接內部的驅動程序對象),而不是我的存根請求。我無法在sql對象中的任何位置找到TediousRequest來將它存根。

我被困在這裏;希望有人有這樣做的代碼或可以解釋我做錯了什麼。

回答

0

嗯,我確實設法解決它,但出於某種原因,感覺有點冒險。可能是因爲我從未想出如何對new sql.Request(conn)調用進行存根。

理想情況下我想得到這個工作,而不必在我的module.exports包括sql庫。我可以用request這個庫來做到這一點,但是經過幾個小時的敲門後,我無法以相同的方式工作。

第一:導出SQL庫:

sql = require('mssql') 
// much code 
module.exports.sqlLib = sql 

二:存根的東西:

var connection, sqlReqStub, sqlStubLib; 
    var server = require('./index.js')  
    sqlStubLib = {};  
    connection = new EventEmitter();  
    connection.connected = true;  
    connection.close = function() {};  
    connection.connect = sinon.stub().callsArgWith(0, null);  
    sqlStubLib.Connect = sinon.stub();  
    sqlStubLib.Connection = function() { 
    return connection; 
    };  
    sqlReqStub = sinon.stub();  
    sqlReqStub.input = function() {};  
    sqlReqStub.execute = sinon.stub();  
    sqlReqStub.execute.withArgs('sp_executesql').onFirstCall().callsArgWith(1, null, [ 
    [ 
    // js object 
    ] 
    ], null, null); 

    sqlStubLib.Request = function() { 
    return sqlReqStub; 
    }; 

    server.sqlLib = sqlStubLib; 
相關問題