我正在为Node Express应用程序编写控制器单元测试。
控制器创建模型类的实例,然后调用其返回已解析的Promise的方法之一。我需要将类构造函数和方法存根,以便它返回一个用测试数据解析的Promise。
控制器:
const Model = require('../../models/model');
module.exports = function (req, res, next) {
const instance = new Model(req.body);
instance.method()
.then(result => {
// do something with result
})
.catch(err => next(err));
};
测试
const proxyquire = require('proxyquire');
const sinon = require('sinon');
require('sinon-as-promised');
const Model = require('../../../../server/models/model');
const stubs = {
model: sinon.stub(Model.prototype, 'method', function () { sinon.stub().resolves('foobar') })
};
const subject = proxyquire('../../../../server/controllers/models/method', {
'../../models/model': stubs.model
});
Sinon.JS Documentation Stub API说:
var stub = sinon.stub(object, "method", func);
用func替换object.method,用间谍包裹。
但是当测试代码在控制器中命中.then
时,我收到此错误:
instance.method(...)。然后不是函数
直接在存根上调用.resolves()
(来自sinon-as-promised
)将then/catch/finally
方法提供给类实例而不是类实例方法根据需要:
sinon.stub(Model.prototype, 'method').resolves('foobar')
提前感谢您的帮助!
答案 0 :(得分:2)
您需要从存根函数返回sinon.stub().resolves('foobar')
。
const stubs = {
model: sinon.stub(Model.prototype, 'method',
function () { return sinon.stub().resolves('foobar') })
};
但是你可能只是更好地返回一个原生的Promise,因为你没有保留对内部存根的引用:
const stubs = {
model: sinon.stub(Model.prototype, 'method',
function () { return Promise.resolve('foobar') })
};
答案 1 :(得分:1)
已经发现了这个解决方案,你自己制作假模型:
const proxyquire = require('proxyquire');
const sinon = require('sinon');
require('sinon-as-promised');
const methodStub = sinon.stub().resolves('foobar');
const ModelStub = function () {
this.method = methodStub;
};
const subject = proxyquire('../../../../server/controllers/models/method', {
'../../models/model': ModelStub
});
信用转到Darren Hurley。