我在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 }
]
}
});
})
有人可以就此事启发我吗?
答案 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
仅为测试组件设置提供程序。