【问题标题】:Javascript unit tesing, test hitting a callback inside functionJavascript单元测试,测试函数内部的回调
【发布时间】:2015-07-09 08:08:33
【问题描述】:

我在测试中无法完全覆盖,我试图在我正在测试的函数中点击回调函数。这是函数:

CrowdControl.prototype.get = function() {
    var options = this.optionsFor('GET');
    return q.Promise(function(resolve, reject) {
        function callback(error, response, body) {
            if (error) {
                reject(error);
            } else {
                resolve(body);
            }
        }

        request(options, callback);
    });
};

所以除了函数回调之外,我已经覆盖了函数:

function callback(error, response, body) {
    if (error) {
        reject(error);
    } else {
        resolve(body);
    }
}

我似乎无法弄清楚如何通过测试来解决这个问题。

上面我有这样的请求被删除

   var request = sinon.stub();

beforeEach(function() {
    CrowdControl = rewire('crowdcontrol');
    CrowdControl.__set__({
        request: request
    });
});

所以我不确定如何让它触发回调并对其进行测试。可以使用一些见解,因为这对我来说仍然是新的。谢谢!

所以我一开始是在尝试一个简单的测试,像这样 -

 it("should call callback function.", function() {
        crowdControl.get();
        //callback should fire?
        expect(callback).to.have.been.called;

    });

【问题讨论】:

    标签: javascript unit-testing sinon chai


    【解决方案1】:

    实现你想要的简单方法是这样的:

    CrowdControl.prototype.get = function(callback) {
        callback = callback || function callback(error, response, body) {
                if (error) {
                    reject(error);
                } else {
                    resolve(body);
                }
            };
        var options = this.optionsFor('GET');
        return q.Promise(function(resolve, reject) {
    
            callback();
            request(options, callback);
        });
    };
    

    您现在可以在测试时注入该函数(如果未提供参数,它将使用真正的实现)。

    CrowdControl.get(someFakeFunction);
    

    【讨论】:

    • 如果可能的话,我不想组织函数(因为我没有创建它,我只是为它编写测试)
    • 嗯,在很多情况下,如果你真的需要覆盖每一行,你必须做一些重构
    • 另一种方法可能是重新定义 q.Promise(...)
    • 只是快速跟进 - jshint 对我大喊大叫,因为这个 W117 Line 72, Col 17 'reject' 没有定义。 W117 第 74 行,第 17 列“解决”未定义。 W098 第 78 行,第 40 列“拒绝”已定义但从未使用过。 W098 第 78 行,第 31 列“解决”已定义但从未使用过。
    【解决方案2】:

    当你使用返回 promise 的函数时,你必须让你的断言(期望)在 then() 中,所以它看起来像这样:

        it("should call callback function.", function(done) {
    var callback = sinon.stub();           
     crowdControl.get(callback).then(function(){
           expect(callback).to.have.been.called;
           done();
        });
    

    【讨论】:

    • 那么,这里应该在哪里定义回调来存根呢?或者更确切地说 - 在这种情况下,回调是如何存根的?
    • 我认为最好的方法是在 @garryp 答案中定义你的回调,然后在你的 beaforeEach() 中有 callback = sinon.stub() 并将它传递给 crowdControl.get(callback)
    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多