我正在尝试测试一个使用Service的组件,该组件在方法的组件中调用。我需要根据测试来模拟和更改该属性。
我有这个:
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);
});
你知道我是否可以用Jasmine嘲笑那个属性?可能吗?
这可以帮助你:https://next.angular.io/guide/testing#always-get-the-service-from-an-injector
基本上当你在configureTestingModule
中提供mock / spy / stub而不是真正的服务时,你需要在TestBed.get()
之后获得它。
在大多数情况下,使用TestBed测试Angular服务会导致过载。检查我的答案here
你可以使用模拟器来提供服务
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);
});