使用inject时,如何在beforeEach中放置异步回调?

时间:2015-03-17 17:47:49

标签: angularjs unit-testing karma-jasmine

在我的单元测试中,我想注入某些模块,我希望beforeEach钩子是异步的。基本上,我正在寻找这样的东西:

beforeEach(inject(function(_$rootScope_, _$compile_, done) {
  ...
}));

然而,这不起作用,因为Karma抱怨没有名为doneProvider的提供者。基本上,它正试图在注入内部寻找任何提供者。

完成通常会插入beforeEach挂钩中,如下所示:

beforeEach(function(done) {
  ...
});

但是我怎样才能注入我需要的东西并且beforeEach仍然是异步的?

我还尝试在beforeEach

中放置一个注入器功能
beforeEach(function(done) {
  inject(function(_$rootScope_, _$compile_) {
    ...
    done();
  });
});

但是当我这样做时,测试会超时。出于某种原因,似乎无法在注入回调中调用done。当我在注入函数之外调用done时,我注入的东西永远不会被设置。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

解决方案非常简单;

  beforeEach(inject(function(_$injector_) {
      $injector = _$injector_;
    }));

  beforeEach(function (done) {
      setTimeout(function () {
        console.log('Got injector: '+$injector);
        done();
      }, 100);
  });

SetTimeout是异步任务的示例。你可以把它放在你的。所以只是不要在注入内部执行任何异步作业,它会没问题。

然后你使用$injector.get('$modal')或任何你需要的东西。