【问题标题】:What is the difference between testbed.get and inject in Angular 2/Jasmine testing?Angular 2/Jasmine 测试中的 testbed.get 和 inject 有什么区别?
【发布时间】:2017-03-28 20:49:15
【问题描述】:

我是 Angular 2 测试的新手。我想弄清楚在测试级别使用testsbed.get() 和仅使用inject 有什么区别。

例如:

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [SomeService]
    });

    const testbed = getTestBed();
    someService= testbed.get(SomeService);
  });
});

it('test service', inject([SomeService], (someService: SomeService) => {

【问题讨论】:

  • 我为你添加了 Jasmine 到标签和标题。因为它是这个问题所涉及的关键技术。
  • 我没有完整的答案,但挖掘代码:inject 在内部调用testbed.get。主要区别在于,如果您将AsyncTestCompleter 提供给inject,它将运行compileComponents,并且提供的对象具有完成异步测试执行的done 函数。看起来这是旧代码,最好改用async(inject(。然后从这一点看起来像一个语法偏好问题。
  • @BrunoLM AsyncTestCompleter 已在内部使用。这不是最终用户关心的问题,使注入效率与 testBed.get 相同

标签: angular jasmine testbed


【解决方案1】:

只是为了添加到现有答案中,如果您像我一样发现了这个问题,因为您想知道 TestBed.get()TestBed.inject() 之间有什么区别,我知道这与 OP 最初要求的不太一样,但它是相关的,并且非常相关。

根据最新的 Angular 文档,我认为值得发布 TestBed.inject()TestBed.get() 的类型安全替换。

来自 TestBed 上的 Angular 文档,可以在 here 找到。

【讨论】:

  • TestBed.inject 是在 Angular v9 中引入的,同时 TestBed.get 已被弃用。
【解决方案2】:

inject 自 AngularJS 以来一直使用辅助函数作为直接注入器调用的替代方法。在 Angular 1 中,有必要使用 ngMock 引导测试。它在 Angular 2 及更高版本中完全是可选的,只是在 TestBed 测试中建议的 DI 方式。

It a convenience wrapper for testBed.get 允许避免多次testBed.get 调用,类似于:

const [foo, bar] = [Foo, Bar].map(TestBed.get);

其他辅助函数可以选择与inject结合使用,即asyncfakeAsync

【讨论】:

    【解决方案3】:

    这些过去是等价的,但在 Angular 9 中,首选方法变为 inject()

    TestBed.get() 在 Angular 9+ 中已弃用,TestBed.inject() 现在是注入依赖项的首选类型安全方式。

    为了清楚起见,请阅读文档:TestBed.get()TestBed.inject()。更改是弃用之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-15
      • 2019-11-08
      • 1970-01-01
      • 2011-11-25
      • 2011-08-18
      • 2017-08-15
      • 2021-10-17
      • 1970-01-01
      相关资源
      最近更新 更多