【发布时间】:2015-07-28 17:15:04
【问题描述】:
我的 node.js 代码是:
function getPatientNotificationNumbers(patientId) {
patientId = patientId && patientId.toString();
var sql = "SELECT * FROM [notification_phone_number] ";
sql += "WHERE patient_id = " + escapeSql(patientId);
return sqlServer.query(sql).then(function(results) {
var phoneNumbers = _.map(results[0], function (result) {
var obj = {
id: result.id,
phoneNumber: result.phone_number,
isPrimary: result.is_primary,
isVerified: result.is_verified,
patientId: result.patient_id
}
return obj;
});
return phoneNumbers;
});
}
非常简单直接。我要测试的是这个函数的返回,正确解析,是一个匹配该格式的phoneNumbers数组。
sqlServer 是上面的require'd,我在这个文件中有很多东西 require'd。我使用mockery 将它们剔除,这似乎非常棒。
这是我的测试,到目前为止:
before(function() {
deferred = Q.defer();
mockery.enable();
moduleConfig.init();
mockery.registerSubstitute('moment', moment);
mockery.registerAllowable('../../util');
mockStubs.sqlServer = {
query: sinon.stub().returns(deferred.promise)
}
mockery.registerMock('../../db/sqlserver', mockStubs.sqlServer);
methods = require('../../../rpc/patient/methods');
});
beforeEach(function() {
deferred = Q.defer();
})
it('should get the patient notification numbers', function(done) {
// sinon.spy(sqlServer, 'query').and.returnValue(deferred.promise);
deferred.resolve('here we go');
methods.getPatientNotificationNumbers(1).then(function(result) {
console.log(result);
done();
});
});
但是,在我的代码中,它永远不会超过 sqlServer.query。所以results 毫无意义。我还尝试了类似的方法:
response = methods.getPatientNotificationNumbers(1)
但是当我console.log(response)时,基本上是{state: 'pending'},我猜这是一个未解决的承诺。
所以我到处都是,我愿意使用任何使事情变得简单的库。我没有与mockery、sinon 或其他任何人结婚。任何建议都会有所帮助。
谢谢!
【问题讨论】:
-
你到底想测试什么? SQL 服务器还是只是
then中的方法?如果它只是then中的方法,只需将其提取到命名函数中。你的承诺代码也是错误的。 -
我的承诺代码有什么问题?
-
你为什么还要延期?
-
所以我可以解决来自存根函数的承诺
-
您是否有任何理由需要异步解决延迟问题?
标签: node.js unit-testing mocking promise mocha.js