Angular 2 - 何时使用注入功能以及何时不使用它

时间:2016-10-19 05:25:20

标签: unit-testing angular karma-jasmine

我在Angular2中创建规格/单元测试时遇到问题。无论何时注入模拟服务,何时使用 注入功能 作为下面的

it('function that the component calls',
  inject([MyService], (service: MyService) => { // ...
}));

或者您何时将其用作下面的

beforeEach(() => {
  let myMockService = new MyMockService();

  TestBed.configureTestingModule({
    providers: [
      { provide: MyService, useValue: myMockService }
    ]
  });
  TestBed.overrideComponent(MyComponent, {
    set: {
      providers: [
        { provide: MyService, useValue: myMockService }
      ]
    }
  });
})

有人可以就此事启发我吗?

2 个答案:

答案 0 :(得分:2)

Angular正在创建时,使用它的主要原因是可以访问测试中的服务。例如

providers: [ MyService ]

Angular正在创建它,你只能通过Angular的注入器访问它。

但您提供的服务是,因此您无需使用inject,因为您已有权访问

let serviceInstance = new Service();

provider: [ { provide: MyService, useValue: serviceInstance } ]

在这里,您已经可以访问serviceInstance,因此无需从进样器中获取它。

此外,如果您不需要访问测试中的服务,那么甚至不需要尝试访问它。但有时候你的模拟会在测试中有你想做的事情。

除了inject之外,只有访问服务的方法

你可以......

对于您的特定示例,您根本不需要inject。您只需将模拟移到beforeEach范围之外,以便it可以使用它

let myMockService = new MyMockService();

beforeEach(() => {

})

it('function that the component calls', () => {
  myMockService.doSomething();
}));

你可以......

您可以从inject获取它,而不是使用TestBed,它就像一个注入器。也许这是首选,因为您可以在beforeEach

中添加它
let service;

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

  service = TestBed.get(MyService);
})

it('function that the component calls', () => {
  service.doSomething();
}));

你可以......

DebugElement获取它,它也像一个注射器

it('function that the component calls', () => {
  let fixture = TestBed.createComponent(TestComponent);
  let service = fixture.debugElement.get(MyService);
}));

所以这真的是一个偏好问题。我个人试图停止使用inject,因为还有其他更简洁的选项。

答案 1 :(得分:0)

当您希望从提交的测试代码中传递实例(例如HTTP inject())或您希望直接在测试代码中与之通信的任何其他服务时,可以使用MockBackend

TestBed.configureXxx仅为测试组件设置提供程序。