首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用mocha chai和sinon测试promises

用mocha chai和sinon测试promises
EN

Stack Overflow用户
提问于 2015-09-05 17:55:31
回答 2查看 2.2K关注 0票数 2

我想使用mochachaisinon.In测试我的promise resolve处理器和promise rejection处理器,另外,我已经设置了sinon-chai插件和sinon-stub-promise插件。

这是我的require语句块:

代码语言:javascript
复制
var chai = require('chai');
var expect = chai.expect;
var sinonChai = require('sinon-chai');
chai.use(sinonChai);
var sinon = require('sinon');
var sinonStubPromise = require('sinon-stub-promise');
sinonStubPromise(sinon);

这是我的测试套件:

代码语言:javascript
复制
describe('Connect to github users',function(done){

    var api = require('../users'),
        onSuccess = api.onSuccess,
        onError = api.onReject; 
    console.dir(api);
    //the idea is not to test the async connection,the idea is to test 
    //async connection but to test how the results are handled.
    var resolveHandler,
        rejectHandler,
        getPromise,
        result;

    beforeEach(function(){
        resolveHandler = sinon.spy(onSuccess);
        rejectHandler = sinon.spy(onError);
        getPromise = sinon.stub().returnsPromise();
    });

    it('must obtain the result when promise is successful',function(){
        result = [...];//is an actual JSON array    
        getPromise.resolves(result);

        getPromise()
            .then(resolveHandler)
            .catch(rejectHandler);

        expect(resolveHandler).to.have.been.called();//error 
        expect(resolveHandler).to.have.returned(result);
        expect(rejectHandler).to.have.not.been.called();    
        done();
    });

    afterEach(function(){
        resolveHandler.reset();
        rejectHandler.reset();
        getPromise.restore();
    });

});

我发现自己遇到了这样的错误:

代码语言:javascript
复制
 Connect to github users must obtain the result when promise is successful:
 TypeError: expect(...).to.have.been.called.toEqual is not a function
  at Context.<anonymous> (C:\Users\vamsi\Do\testing_promises\test\githubUsersSpec.js:94:46)
EN

回答 2

Stack Overflow用户

发布于 2017-05-29 22:08:37

sinon-with-promise包应该符合您想要做的事情。我遇到了同样的问题(除了我不需要测试拒绝用例),它很好地解决了。

票数 0
EN

Stack Overflow用户

发布于 2015-09-05 19:11:30

这里的这行代码是错误的:

代码语言:javascript
复制
expect(resolveHandler).to.have.been.called();

called只是spy上的一个属性,它的值始终是一个boolean,并且可以像这样使用chai进行简单的测试:

代码语言:javascript
复制
expect(resolveHandler.called).to.equal(true);

类似地,不使用此行来确认函数没有被拒绝:

代码语言:javascript
复制
expect(rejectHandler).to.have.not.been.called();

将此作为属性与called一起使用:

代码语言:javascript
复制
expect(rejectHandler.called).to.equal(false);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32411734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档