[英]Unit tests: Testing inner Promise
我已经在网上搜索了一段时间,但尚未找到答案。
假设我们正在测试以下内容:
function p() {
return Promise.resolve(1);
}
class Sample {
constructor() {
this.stuff = 2;
}
sample () {
p().then((data) => {
this.stuff = data;
});
//more stuff
}
}
module.exports = {Sample};
我们如何检查该结果,最终填充this.stuff
而不返回上述承诺?
到目前为止,这是我能够做的:
let expect = require('chai').expect;
let sinon = require('sinon');
let Sample = require('./source.js').Sample;
describe('stuff', function () {
it('test2', function() {
let sample = new Sample();
return Promise.resolve(sample.sample())
.then(() => {
expect(sample.stuff).to.be.eql(2);
});
});
});
其中,每个then
得到一个信用(如果我们有多个then
是我们的样本中,我们想也需要多个then
S IN我们的测试)。
(并且在您说process.nextTick
之前,我希望它可以通过karma-mocha在浏览器中运行)
提前致谢!
如果代码经过重组以支持可测试性,则可以很容易地对其进行测试。
一种方法是为对象实例化使用可选的p
接口。 该值可以默认为您定义的p
但允许进行测试以创建伪造的对象并验证您的Sample
是否在其上正确运行。
function p() {
return Promise.resolve(1);
}
class Sample {
constructor(pFn) {
this.stuff = 2;
this.p = pFn || p;
}
sample () {
this.p().then((data) => {
this.stuff = data;
});
//more stuff
}
}
这将允许您为单元测试提供一个类似promise的对象,该对象可以同步执行。
一种方法是定期检查设置值。
it('test2', function(done) {
let sample = new Sample();
let assert = function() {
if(sample.stuff === 2) {
done();
} else {
setTimeout(assert, 0);
}
};
sample.sample();
assert();
});
它不是最漂亮的,并且不会在失败时给出最佳的错误消息,但是它可以工作。 如果没有在两秒钟内将sample.stuff
设置为2
(我认为默认值为3秒),则测试将失败,因为未及时调用done()
。
另一个可能的选择是让测试用设置器替换stuff
。 然后您可以在set上expect()
。
it('test2', function(done) {
let sample = new Sample();
Object.defineProperty(sample, 'stuff', { set: function (value) {
expect(value).to.be.eql(2);
done();
}});
sample.sample();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.