Jasmine 2.0完成后和每个

时间:2016-04-01 10:39:43

标签: javascript unit-testing asynchronous jasmine

我正在使用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运行,安装时钟,记录"安装"
  • 测试运行,setTimeout 做任何事情
  • 测试等待5秒(默认超时jasmine在失败之前)
  • 测试失败,因为永远不会调用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显示问题

2 个答案:

答案 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。