【发布时间】:2019-12-19 14:51:09
【问题描述】:
我想知道我对正在构建和测试的服务的方法是否正确。我一直将我的类设计为尽可能封装。因此,在构建我的角度服务时,我以相同的方式构建它们。
下面是我的服务外观的 sn-p:
private postUrl = 'https://localhost:44359/api/posts';
private currentGetPostsUrl = `${this.postUrl}?page=${this.pageNumber}&pageSize=${this.pageSize}`;
private filteredPostListSource = new Subject<IPostViewDto[]>();
filteredPostList$ = this.filteredPostListSource.asObservable();
// post list returned from the api
private originalPostList: IPostViewDto[];
// filtered list that is displayed to user
private filteredPostList: IPostViewDto[];
//get a list of posts that are paginated
getPosts(): Observable < IPostViewDto[] > {
const urlToFetch = `${this.postUrl}?page=${this.pageNumber}&pageSize=${this.pageSize}`;
// if the post list exists, return that post list
if(this.originalPostList) {
return of(this.originalPostList);
}
return this.http.get<IPostViewDto[]>(urlToFetch, { observe: 'response' })
.pipe(
map((response: HttpResponse<IPostViewDto[]>) => {
const paginationHeader = JSON.parse(response.headers.get('X-Pagination'));
this.totalCount = paginationHeader.totalCount;
this.originalPostList = response.body;
this.filteredPostList = [...this.originalPostList];
return response.body;
}),
catchError(err => this.errorHandler(err))
);
}
如上所述,我不允许组件直接访问私有变量,而是使用方法来完成所有交互。这里的问题是单元测试有点混乱。如果我想正确测试我的getPosts() 方法是否正确返回我的originalPostList 中的帖子列表(如果存在),我必须在为 http get 创建存根值后运行一次以确保私有字段获取设置,然后再次运行它并比较我的存根值等于getPosts() 的第二次运行。
这似乎不仅是一个糟糕的单元测试,而且可能服务本身没有正确构建以进行测试。
将其重组为易于测试的最佳方法是什么?我是否只是创建 getter/setter 并针对它们进行测试?还是我上面描述的方法有效?
请注意,我以这种方式设计它的原因是因为我不希望子组件/其他组件在没有显式方法调用的情况下意外更新这些属性(以便我可以编写测试以确保是这种情况) .这不是因为单个组件是唯一访问此服务的组件。
【问题讨论】:
标签: angular unit-testing karma-jasmine