如何仅对一个测试覆盖Angular 5中的Provider? [英] How override Provider in Angular 5 for only one test?
问题描述
在我的一个单元测试文件中,我不得不使用不同的模拟对同一服务进行多次模拟.
In one of my unit test files, I have to mock several times the same service with different mocks.
import { MyService } from '../services/myservice.service';
import { MockMyService1 } from '../mocks/mockmyservice1';
import { MockMyService2 } from '../mocks/mockmyservice2';
describe('MyComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
MyComponent
],
providers: [
{ provide: MyService, useClass: MockMyService1 }
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MapComponent);
mapComponent = fixture.componentInstance;
fixture.detectChanges();
});
describe('MyFirstTest', () => {
it('should test with my first mock', () => {
/**
* Test with my first mock
*/
});
});
describe('MySecondTest', () => {
// Here I would like to change { provide: MyService, useClass: MockMyService1 } to { provide: MyService, useClass: MockMyService2 }
it('should test with my second mock', () => {
/**
* Test with my second mock
*/
});
});
});
我看到函数 overrideProvider 存在,但是我没有设法在我的测试中使用它.当我在"it"中使用它时,提供程序不会更改.我没有找到一个调用此函数的示例.您能解释一下如何正确使用它吗?还是您有其他方法可以做到这一点?
I see that the function overrideProvider exists, but I did not manage to use it in my test. When I use it in a "it", the provider doesn't change. I didn't manage to find an example where this function is called. Could you explain me how to use it properly? Or have you an other method to do that?
推荐答案
如果服务是作为公共属性注入的,例如:
If the service is injected as public property, e.g.:
@Component(...)
class MyComponent {
constructor(public myService: MyService)
}
您可以执行以下操作:
it('...', () => {
component.myService = new MockMyService2(...); // Make sure to provide MockMyService2 dependencies in constructor, if it has any.
fixture.detectChanges();
// Your test here...
})
如果注入的服务存储在私有属性中,则可以将其写为(component as any).myServiceMockMyService2 = new MockMyService2(...);
来绕过TS.
If injected service is stored in a private property, you can write it as (component as any).myServiceMockMyService2 = new MockMyService2(...);
to bypass TS.
虽然不漂亮,但是可以.
It's not pretty but it works.
对于TestBed.overrideProvider
,我对这种方法没有运气(如果可行的话会更好):
As for TestBed.overrideProvider
, I had no luck with that approach (which would be much nicer if it worked):
it('...', () =>{
TestBed.overrideProvider(MyService, { useClass: MockMyService2 });
TestBed.compileComponents();
fixture = TestBed.createComponent(ConfirmationModalComponent);
component = fixture.componentInstance;
fixture.detectChanges();
// This was still using the original service, not sure what is wrong here.
});
这篇关于如何仅对一个测试覆盖Angular 5中的Provider?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!