Вы издеваетесь над тестируемой службой, вам следует высмеять службу, используемую вашей службой EndpointLocatorService
и, возможно, даже HttpClient
, чтобы минимизировать насмешки. Вы можете проверить это, пройдя по коду.
Позвольте мне объяснить в коде, почему эти строки не удаляются.
// In this example, the lines are hit, but after the test exited.
it('should call the service', () => {
spyOn(endLocator, 'locate').and.returnValue('someUrl');
spyOn(cancelService, 'getScopeSignature').and.callThrough();
// Here you are calling a method yourself and checking that it was
// called, it doesn't make sense, this test should make sure
// You should check that your endLocator was called.
// Note that because you are not waiting for the promise to resolve,
// The test finishes before either callback is handled.
cancelService.getScopeSignature(body);
expect(cancelService.getScopeSignature).toHaveBeenCalled();
});
// In this example the lines in your test are never hit because you
// mocked it
it('should return a object', () => {
(done: DoneFn) => {
spyOn(endLocator, 'locate').and.returnValue('someUrl');
// Here you are mocking getScopeSignature completely so it doesn't
// Run any of your lines that you are trying to test
// It just tests that you mocked it correctly
spyOn(cancelService, 'getScopeSignature').and.returnValue(mockData);
cancelService.getScopeSignature(body).subscribe(data => {
expect(data).toEqual(mockData);
done();
});
}
});
Я не могу переписать ваш тест, так что он на самом деле тестирует его, потому что это зависит от того, как работает EndpointLocatorService
, и вы можете также выбрать его на этом уровне. Обычно я выбираю макет на уровне HttpClient
, поскольку могу копировать ответы вставки со вкладки сети.
Суть в том, что вам нужно имитировать сервисы, используемые вашим сервисом, а не сам сервис. У вас есть возможность издеваться над прямыми услугами, используемыми вашим компонентом, или вы можете издеваться на более глубоком уровне. Например, вашему EndpointLocatorService
может потребоваться позвонить по номеру HttpClient
, и вы можете выбрать макет любой из этих услуг.
См. https://angular.io/guide/testing#httpclienttestingmodule и https://alligator.io/angular/testing-httpclient/