Javascript 单元测试,测试命中函数内部的回调
Javascript unit tesing, test hitting a callback inside function
我无法在我的测试中获得完整的覆盖范围,因为我试图在我正在测试的函数中调用回调函数。这是函数:
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;
});
当你使用 return 承诺的函数时,你必须让你的断言(期望)在 then() 中,所以它看起来像这样:
it("should call callback function.", function(done) {
var callback = sinon.stub();
crowdControl.get(callback).then(function(){
expect(callback).to.have.been.called;
done();
});
实现您想要的效果的简单方法是:
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);
我无法在我的测试中获得完整的覆盖范围,因为我试图在我正在测试的函数中调用回调函数。这是函数:
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;
});
当你使用 return 承诺的函数时,你必须让你的断言(期望)在 then() 中,所以它看起来像这样:
it("should call callback function.", function(done) {
var callback = sinon.stub();
crowdControl.get(callback).then(function(){
expect(callback).to.have.been.called;
done();
});
实现您想要的效果的简单方法是:
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);