Жасмин Angular Атрибут фиктивного компонента - PullRequest
0 голосов
/ 13 июля 2020

Выполняемая команда:

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

Сообщение об ошибке:

TypeError: Невозможно прочитать свойство 'substring' неопределенного

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'));
}

I понимаю, что атрибут не определен, но я не могу сделать его «определенным». Я уже пытался использовать третий массив из jasmine.createSpyObj () для отслеживания свойств, но ошибка не исчезла. И попытался передать объект JSON в mockExtratosMensaisService returnValue (of ({object})), и попробовал следующее:

 mockExtratosMensaisService.getServentiaSelecionada.and.returnValue(of({ titularidade: 123 }));

Я использую неправильный подход? Мне нужно пройти этот тест.

spe c .component file:

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 ]

1 голос
/ 13 июля 2020

Попробуйте изменить макет на:

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

А затем выполните

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

Я изменил 123 на 'ab c', потому что не уверен, будет ли подстрока работать с число. Раньше вы все еще возвращались, и это неверно, потому что это не наблюдаемый объект, это обычный объект JavaScript.

0 голосов
/ 13 июля 2020

Ваш подход с: mockExtratosMensaisService.getServentiaSelecionada.and.returnValue(of({ titularidade: 123 })); неплох. Но вам нужен шпионский объект, который вы можете вызвать .and.returnValue(). Чтобы получить это, вы можете сделать следующее: spyOn(mockExtratosMensaisService, 'getServentiaSelectionada').and.returnvalue(of({titularidade: 123}))

Это должен быть способ go.

...