【问题标题】:Angular (8) - Unit testing service with private variables [duplicate]Angular (8) - 带有私有变量的单元测试服务
【发布时间】: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


    【解决方案1】:

    您可以创建用于访问私有变量的 getter 方法,也可以将其更改为 public 并添加 readonly 到它。这样其他组件/测试可以访问它但不能更改它。

    在我看来,你不应该调用两次方法来测试它们。从您的示例中,我可能会创建一个接受 GET 参数的函数。一旦你有了它,你就可以测试你正在访问正确的 API 端点并通过 HttpClientTestingModule 获取正确的数据对象。

    【讨论】:

      【解决方案2】:

      我同意您不应在测试中访问私有变量。否则,当您需要进行重构时,您的测试将毫无用处。

      我认为在您的测试中调用该方法两次没有问题。我假设它会在实际代码中发生,因为您正在实现缓存机制。 “你的测试与你的软件使用方式越相似,它们能给你的信心就越大。”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 1970-01-01
        • 2014-02-09
        相关资源
        最近更新 更多