【发布时间】:2020-07-13 12:58:13
【问题描述】:
运行命令:
ng 测试 --codeCoverage=true --progress=false --watch=false
错误信息:
TypeError: 无法读取未定义的属性“子字符串”
组件的NgOnInit
private serv: ExtratosMensaisService,
ngOnInit(): void {
const serventia: Serventia = this.serv.getServentiaSelecionada();
const competencia: Competencia = this.serv.getCompetenciaSelecionada();
const titularidade = serventia.titularidade.substring(0, 1).toUpperCase();
}
服务文件方法:
getServentiaSelecionada(): Serventia {
return JSON.parse(sessionStorage.getItem('serventia'));
}
我知道该属性是未定义的,但我无法将其设为“已定义”。 我已经尝试使用 jasmine.createSpyObj() 中的第三个数组来监视属性,但错误仍在继续。 并尝试在 mockExtratosMensaisService returnValue(of({ object })) 上传递一个 JSON 对象,并尝试了这个:
mockExtratosMensaisService.getServentiaSelecionada.and.returnValue(of({ titularidade: 123 }));
我是否使用了错误的方法?我需要通过这个测试。
spec.component 文件:
describe('PrestacaoContasTitularComponent', () => {
let component: PrestacaoContasTitularComponent;
let fixture: ComponentFixture<PrestacaoContasTitularComponent>;
const mockExtratosMensaisService = jasmine.createSpyObj('Obj',
['getServentiaSelecionada', 'getCompetenciaSelecionada'],
['titularidade']);
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [ RouterTestingModule, HttpClientTestingModule ],
declarations: [ PrestacaoContasTitularComponent ],
providers: [ MatDialog, Overlay, MatSnackBar,
{ provide: ActivatedRoute, useValue: {} },
{ provide: InjectionToken, useValue: {} },
{ provide: MAT_DIALOG_SCROLL_STRATEGY, useValue: {} },
{ provide: ExtratosMensaisService, useValue: mockExtratosMensaisService }
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(PrestacaoContasTitularComponent);
component = fixture.componentInstance;
mockExtratosMensaisService.getServentiaSelecionada.and.returnValue(of({ titularidade: 123 }));
mockExtratosMensaisService.getCompetenciaSelecionada.and.returnValue(of({ data: 'competencia' }));
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
【问题讨论】:
-
尝试将模拟更改为:
const mockExtratosMensaisService = jasmine.createSpyObj('Obj', ['getServentiaSelecionada', 'getCompetenciaSelecionada']);,然后执行mockExtratosMensaisService.getServentiaSelecionada.and.returnValue({ titularidade: 'abc' });。我将 123 更改为“abc”,因为我不确定substring是否可以处理某个数字。之前,您仍然返回of,这是不正确的,因为它不是可观察的,而是常规的 JavaScript 对象。 -
此解决方案运行良好。再次感谢。你能像回答我“接受这个答案”一样回答这个问题吗?只是为了正确地归功于您。
标签: angular testing mocking jasmine