实际上,我在过去一周才遇到这个问题,所以这对我来说很新鲜。 Jasmine 也让我有些困惑,所以我可以分享我为解决我的问题所做的工作。
首先,Angular 教程会误导新测试人员。它声称我们应该使用 Jasmine,但随后开始使用 TestBed,这有点误导。我最终选择了 TestBed,我可以向你展示我使用了什么。
所以你有你的描述:
descripe('randomService', () -> {
}
你需要初始化你的`randomService':
descripe('randomService', () -> {
let randomService: RandomService;
}
使用 beforeEach(),您可以在 describe 中的每个 it 语句之前重新初始化、赋值等。
descripe('randomService', () -> {
let randomService: RandomService;
beforeEach(() => {
imports: [
HttpClientTestingModule
]
});
}
所以我告诉 Angular 在每个 it 块之前重新导入 HttpClientTestingModule。我的randomService 需要HttpClient,所以我需要创建一个Jasmine Spy 对象,它会返回我告诉它的内容,而不是让我的randomService 访问实际后端并更改后端中的真实数据。
descripe('randomService', () -> {
let randomService: RandomService;
httpClientSpy;
beforeEach(() => {
imports: [
HttpClientTestingModule
]
});
httpClientSpy = jasmine.CreateSpyObj('Http', ['get']);
randomService = new RandomService(<any> httpclientSpy);
}
所以现在每当我在我的 randomService 中执行“get”方法时,它实际上会使用 httpClientSpy,并且它会编译,因为我告诉 randomService 我的参数是“any”类型并且据其所知,即实际上是一个真正的 HttpClient,即使它不是。要正确使用它,您必须为您的虚假获取设置虚假退货:
descripe('randomService', () -> {
let randomService: RandomService;
httpClientSpy;
mockResponse = { 1: ['first', 'second', 'third'] };
beforeEach(() => {
imports: [
HttpClientTestingModule
]
});
httpClientSpy = jasmine.CreateSpyObj('Http', ['get']);
randomService = new RandomService(<any> httpclientSpy);
});
it('should return first, second, third', () => {
spyOn(httpClientSpy, 'get').and.returnValue(Observable.of(mockResponse));
// randomService. <your get method here...>
randomService.getValue().subscribe((response) =>
expect(resposne[0].length).toEqual(3);
};
});
该响应应该是在我们的 beforeEach() 中创建的 mockResponse,它不必在 beforeEach() 中,但在这个示例中,我将它留在了那里。