我在 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 }
]
}
});
})
有人可以启发我这件事吗?
使用它的主要原因是在 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
,因为还有其他不那么冗长的选项。
当您想要从提供中获取传递到测试代码(例如 HTTP MockBackend
(或您希望直接在测试代码中与之通信的任何其他服务的实例时,可以使用 inject()
。
TestBed.configureXxx
仅为测试组件设置提供程序。