首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复此Q.denodify测试?

如何修复此Q.denodify测试?
EN

Stack Overflow用户
提问于 2015-05-30 16:33:38
回答 1查看 62关注 0票数 2

我使用的是一个数据库库,它的基于回调的接口如下所示:

代码语言:javascript
复制
var DB = {
    insert: function(options, callback) {

    }
}

我想在这个数据库周围实现一个包装器,以将其回调风格的API转换为基于promise的API。为此,我定义了以下类:

代码语言:javascript
复制
var DatabaseWrapper = {
    init: function(db) {
        this.db = db;
    },
    insert: function(options) {
        return Q.denodeify(this.db.insert.bind(this.db))(options);
    }
}

我想要编写一个单元测试,以确保当我调用DatabaseWrapper.insert时,它会调用DB.insert。到目前为止,我的测试如下所示:

代码语言:javascript
复制
describe('DatabaseWrapper', function () {
    var wrapper, insertSpy, bindStub;

    beforeEach(function () {
        wrapper = Object.create(DatabaseWrapper);
        insertSpy = sinon.spy(function () {
            console.log('insertSpy got called');
        });
        bindStub = sinon.stub();

        wrapper.db = {
            insert: function (options, callback) {
            }
        };

        sinon.stub(wrapper.db.insert, 'bind').returns(insertSpy);
    });


    describe('#insert', function () {
        it('should delegate to db.insert', function (done) {
            wrapper.insert({herp: 'derp'});

            expect(wrapper.db.insert.bind).to.have.been.calledOnce;

            // This fails but I expect it to succeed
            expect(promise).to.have.been.calledOnce;
        })
    });
});

DB实例的insert方法实际上是在测试失败后调用的,因为在控制台中输出了'insertSpy got called'消息。

但显然,它是在测试失败后调用的。

据我所知,这是由于Node的process.nextTick的工作方式。因此,对回调的调用发生在测试失败之后。有没有办法在不依赖第三方库(例如q-flush)的情况下修复这个测试?

EN

回答 1

Stack Overflow用户

发布于 2015-05-30 22:14:11

您正在执行异步操作,因此最好执行异步测试。添加setTimeout仍然会使您容易出现竞争情况。

代码语言:javascript
复制
describe('#insert', function () {
        it('should delegate to db.insert', function () { // no done here
            // note the return here to signal to mocha this is a promise test 
            return wrapper.insert({herp: 'derp'}).then(function(){
              // add expects here, rest of asserts should happen here
              expect(wrapper.db.insert.bind).to.have.been.calledOnce;   
            }); 
        })
    });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30544044

复制
相关文章

相似问题

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