开发者问题收集

Jasmine Angular Mock 组件属性

2020-07-13
998

正在运行命令:

ng test --codeCoverage=true --progress=false --watch=false

错误消息:

TypeError: Cannot read property 'substring' of undefined

组件的 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();
});

});

2个回答

尝试将模拟更改为:

const mockExtratosMensaisService = jasmine.createSpyObj('Obj', ['getServentiaSelecionada', 'getCompetenciaSelecionada']);

然后执行

mockExtratosMensaisService.getServentiaSelecionada.and.returnValue({ titularidade: 'abc' });.

我将 123 更改为“abc”,因为我不确定子字符串是否适用于数字。之前,您仍然返回,这是不正确的,因为它不是可观察对象,而是常规 JavaScript 对象。

AliF50
2020-07-13

您的方法: mockextratosmensaisservice.getServentiaSelecionada.and.ReturnValue(of({tiTularIdade:123})); 非常好。 但是您需要一个可以调用 .and.returnvalue() 的间谍对象 为此,您可以喜欢: spyon(mockextratosmensaisservice,'getserventiaselectionda')和。returnvalue(of({{tiTularIdade:123}))

这应该是一种方法去。

Andreas Rainer
2020-07-13