我正在使用jasmine 2.0。
我正在尝试了解done()
功能。
使用以下基本茉莉花代码:
describe('Jasmine 2.0 done()', function() {
beforeEach(function () {
console.log('install');
jasmine.clock().install();
});
afterEach(function () {
console.log('uninstall');
jasmine.clock().uninstall();
});
it('should wait 1ms then complete', function (done) {
setTimeout(function(){
console.log('async');
expect(true).toBe(true);
done();
}, 1)
});
});
我认为我认为发生了什么:
beforeEach
运行,安装时钟,记录"安装" done()
。Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
afterEach
然后运行,卸载时钟并记录"卸载" 我期待那个
beforeEach
运行,安装时钟和日志"安装" done()
afterEach
运行,卸载时钟并记录"卸载" 我认为这是因为文档说
在完成调用后,此规范才会完成。
所以我假设afterEach
会等到调用done()
来执行。
我已尝试在done()
中添加afterEach
afterEach(function (done) {
console.log('uninstall');
jasmine.clock().uninstall();
done();
});
这没什么区别。
为什么这个测试没有成功?
我不了解done()
功能?
plunker显示问题
答案 0 :(得分:1)
安装jasmine的模拟时钟时,setTimeout
行为被覆盖。当通过jasmine.clock().tick
函数向前勾选时钟时,将触发对任何已注册回调的调用,这需要花费几毫秒(link to jasmine docs)
当通过jasmine.clock()。tick函数勾选时钟时,会触发对任何已注册回调的调用,这需要花费几毫秒。
在您的情况下,测试规范将如下所示:
describe('Jasmine 2.0 done()', function() {
beforeEach(function () {
console.log('install');
jasmine.clock().install();
});
afterEach(function () {
console.log('uninstall');
jasmine.clock().uninstall();
});
it('should wait 1ms then complete', function (done) {
setTimeout(function(){
console.log('async');
expect(true).toBe(true);
done();
}, 1);
jasmine.clock().tick(1);
});
});
答案 1 :(得分:0)
使用Jasmine异步测试,我们必须调用beforeEach()
和afterEach()
函数中的异步代码,该函数在it()
功能块中的每个describe()
功能块之前运行。
这意味着必须在上述方法中调用done()
回调,否则测试将变为同步,如果超过超时间隔,它将阻塞调用线程。
beforeEach(function (done) {
console.log('install');
jasmine.clock().install();
done();
});
afterEach(function (done) {
console.log('uninstall');
jasmine.clock().uninstall();
done();
});
Here是一个有效的JSFiddle。