我正在尝试测试使用服务的组件,该组件具有在方法的组件内部调用的属性。我需要根据测试来模拟和更改该属性。
我有这个:
export class XService{
xProperty:boolean;
}
export class XComponent{
ctor(private xService:XService){
}
xMethod():void{
if(xService.xProperty){
//some code
}
}
}
我尝试过创建模拟并在beforeEach方法中添加属性
beforeEach(() => {
/**more code**/
xServiceMock = jasmine.createSpyObj(['xMethodService']);
xServiceMock ['xProperty'] = false;
});
这很好,直到我必须更改其中一项测试的值为止。当我这样做时,该值不会刷新。
it('x validation', () => {
xServiceMock.xProperty = true;
fixture.detectChanges();
component.xMethod();<<<-- When it calls the method the change to TRUE is not refreshed
expect(/****/).toBe(false);
});
您知道我是否可以用茉莉花来嘲笑那个财产吗?有可能吗?
答案 0 :(得分:0)
这可以帮助您: https://next.angular.io/guide/testing#always-get-the-service-from-an-injector
基本上,当您在configureTestingModule
中提供模拟/间谍/存根而不是真实服务时,需要在以后使用TestBed.get()
来获得它。
答案 1 :(得分:0)
在大多数情况下,使用TestBed测试Angular服务会导致过载。检查我的答案here
答案 2 :(得分:0)
您可以为服务使用模拟
class MockXService extends XService{
xProperty = false; // set a fake value here
}
以这种方式将服务添加到提供商
beforeEach(async(() => {
TestBed.configureTestingModule({
...,
declarations: [XComponent],
providers: [
{ provide: XService, useClass: MockXService },
],
})
和您的测试
it('x validation', () => {
fixture.detectChanges();
component.xMethod();<<<-- When it calls the method the change to TRUE is not refreshed
expect(/****/).toBe(false);
});