在使用 Jasmine 进行单元测试时,我应该模拟、监视或存根注入到我的组件中的服务吗?

While doing Unit testing with Jasmine should I mock or spy or stub my service which is injected in my component?

在我的 component.ts 中,服务已注入组件的构造函数中,该组件订阅服务中的函数并接收信息。在那种情况下我该如何测试我的组件?

在component.ts中我有以下代码:-

在这种情况下我该如何处理?

您要么必须模拟您的服务,这在单元测试方面总是一个好主意,要么使用间谍,如下所述。

选项模拟:

...
providers: [
 {provide: PartService, useClass: MockPartService},
],
...

class MockPartService {
   list(): Observable<Part[]> {
   return Observable.of([...]);
}

您必须使用与您在测试中调用的方法签名相同的方法签名来编写 MockService。您可能希望将预期的 return 值硬编码到此 MockClass 中。当您想模拟时,这通常是您想要的,例如API 请求等,这样您的测试就不会抛出。

选项间谍:

const mockParts: Part[] = [...]
const serviceSpy = spyOn(PartService, 'list').and.ReturnValue(Observable.of(mockParts));

当您希望服务为您的测试提供特定 return 时使用此选项。

您也可以在测试中自由混合使用。 存根 spyOn(YourService, 'YourMethod').and.stub() 只会阻止调用实际方法,但不会 return 任何值。