【发布时间】:2015-03-28 23:36:36
【问题描述】:
我有一个节点控制器“simpleController”,它依赖于“DataAccess”的一个实例。控制器在“DataAccess”实例上调用函数“getData”并返回一个promise。如果 promise 然后被拒绝,控制器应该返回 500 的状态。
我想在“simpleController”上编写一个测试,但要模拟“DataAccess”的实例,这样我就可以返回一个失败的承诺并断言“simpleController”的行为符合预期。
我试图编写一个单元测试来执行此操作,但测试超时。
(function (simpleController) {
var DataAccess = require('./DataAccess');
var dataAccessInstance;
simpleController.init = function (dataSource) {
dataAccessInstance = new DataAccess(dataSource);
};
simpleController.setMockDependencies = function (mockDataAccessInstance) {
dataAccessInstance = mockDataAccessInstance;
};
simpleController.performAction = function (req, res) {
var entityId = req.query.id;
dataAccessInstance.getData(entityId)
.then(function (data){
res.status(200).json(data);
},
function (err) {
res.status(200).json(err);
});
}
})(module.exports);
/* global describe, it */
'use strict';
var assert = require('assert');
var sinon = require('sinon');
var Q = require('q');
var DataAccess = require('../lib/temp/DataAccess');
describe('Simple Controller Tests', function () {
var simpleController;
var dataAccess;
beforeEach(function (done) {
simpleController = require('../lib/temp/simpleController');
var dataSource = 'dummy';
dataAccess = new DataAccess(dataSource);
done();
});
it('should return status of 500 if data access fails', function (done) {
// Arrange
var req = { query: { id: '12345678' } };
var res = {};
var deferred = Q.defer();
var stub = sinon.stub(dataAccess, 'getData', function() {
return deferred.promise;
});
simpleController.setMockDependencies(dataAccess);
deferred.promise.fail(function () {
// Assert
assert.ok(stub.called);
assert.equal(res.status, 500);
done();
});
// Act
simpleController.performAction(req, res);
deferred.reject();
});
});
(function () {
function DataAccess(dataSource) {
this.dataSource = dataSource;
}
DataAccess.prototype.getData = function (entityId) {
throw new Error('Not implemented');
};
module.exports = DataAccess;
})();
任何帮助将不胜感激。
【问题讨论】:
标签: javascript node.js mocha.js q sinon