使用柴和冼方法在一个方法内扼杀诺言
我testing的function大致是这样的;
function doThing(data, callback) { externalService.post('send').request(data) .then(() => { if (callback) { callback(); } }) .catch((message) => { logger.warn('warning message'); if (callback) { callback(); } }); }
我试图用柴和诗乃来testing。
我尝试过不同的指南,我目前的咒语看起来像;
const thingBeingTested = require('thing-being-tested'); const chai = require('chai'); const sinon = require('sinon'); require('sinon-as-promised'); const sinonChai = require('sinon-chai'); const expect = chai.expect; var chaiAsPromised = require('chai-as-promised'); chai.use(chaiAsPromised); chai.use(sinonChai); describe('The Thing', () => { it('should run a callback when requested and successful', done => { const externalService = { post: { request: sinon.stub() } }; const callback = sinon.spy(); externalService.post.request.resolves(callback); doThing({...}, callback); expect(callback).to.have.been.called; done(); }); });
我无法正确取出externalService.post
。 任何帮助将不胜感激。
对于柴和诗乃来说,我是一个全新的人 – 所以我完全期望做一些愚蠢的事情。
您的doThing
函数无法从您的testing中访问const externalService
。 我会假设你的主文件有这样的
const externalService = require('./external_service');
为拿到它,为实现它。
在你的testing中,你也应该得到相同的externalService
:
describe(..., () => { it(..., () => { // adjust the path accordingly const externalService = require('./external_service');
然后嘲笑它的方法:
sinon.stub(externalService, 'post').returns({ request: sinon.stub().resolves(callback) });
然后,您可以调用doThing
并分析结果。
testing完成后,不要忘记恢复原来的post
externalService.post.restore();