jasmine 2 - 在jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时时间内未调用异步回调

时间:2015-03-23 19:42:41

标签: javascript jasmine

遇到jasmine 2问题并且异步规格连线:

define(['foo'], function(foo) {
  return describe('foo', function() {
    beforeEach(function(done) {
      window.jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
      return setTimeout((function() {
        console.log('inside timeout');
        return done();
      }), window.jasmine.DEFAULT_TIMEOUT_INTERVAL);
    });
    return it('passes', function() {
      return expect({}).toBeDefined();
    });
  });
});

当我经历业力时,我会回来

  

错误:超时 - 超时内未调用异步回调   由jasmine.DEFAULT_TIMEOUT_INTERVAL指定。

然后规格失败。我试图覆盖默认超时但我无法通过错误

3 个答案:

答案 0 :(得分:20)

您正在使用与Jasmine用于在超时时测试失败相同的超时间隔,即您的超时被触发以使用Jasmine的默认间隔触发,但未通过测试。

如果将超时设置为小于jasmine默认超时,则测试通过。

describe('foo', function () {
    beforeEach(function (done) {
        window.jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
        setTimeout(function () {
            console.log('inside timeout');
            done();
        }, 500);
    });
    it('passes', function () {
        expect({}).toBeDefined();
    });
});

请参阅小提琴here

答案 1 :(得分:5)

我的2分。我在另一个场景中也遇到了问题中提到的这个错误。

我有一个非常简单的规范:

describe('login feature', function() {
    it('should show the logged in user name after successful login', function(done) {
        expect({}).toBeDefined();
        //done(); // if you don't call this done here, then also above error comes
    });
});

在' it'

中查看已注释的// done()函数

答案 2 :(得分:2)

可能适合您的另一个选项是使用async

  

async函数是Angular测试实用程序之一,必须导入...它接受一个无参数函数并返回一个函数,该函数成为beforeEach的真正参数

     

async参数的主体看起来很像同步beforeEach的主体。关于它没有明显的异步。例如,它没有返回一个promise,也没有完成函数调用,就像在标准的Jasmine异步测试中一样。在内部,异步安排beforeEach的主体在一个隐藏异步执行机制的特殊异步测试区域中运行。

请参阅:https://angular.io/docs/ts/latest/guide/testing.html#!#async-in-before-each

describe('Component: MyComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      providers: [
        {provide: MyService, useValue: MyServiceMock()},
      ]
    })
    // Using webpack through Angular Cli. You may need ".compileComponents()"
    fixture = TestBed.createComponent(MyComponent)
    component = fixture.componentInstance
    // Initialize the component
    component.ngOnInit()
    fixture.detectChanges()
  }))

  it('should show the logged in user name after successful login',() {
      expect({}).toBeDefined()
  })
})