在使用 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 任何值。
在我的 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 任何值。