如何在单元测试中模拟私有变量?

时间:2018-06-01 18:03:30

标签: angular karma-jasmine

我有一个班级,我正在编写测试。提前我的上司和我都认识到这是重构的候选人,并且它已被添加到积压中。与此同时,我们正在寻找快速解决方案。

问题在于,类中的许多方法都使用私有变量。但是,除非先调用一个特定方法,否则它们为null。是的,它不应该像这样耦合。但它现在就是这样。

我的课程是这样的服务:

import { Injectable } from "@angular/core";

@Injectable()
export class SortService {

constructor() { }

// Private Members
private allSort: Output[] = null;
private supportedSort: Output[] = null;
private allSortMap: Map<string, Output> = new Map<string, Output>();

checkSort(): Promise<void>
{ //Populate variables happens here along with other business logic }

//returns the list of all sort output device kinds
getSortOutput(name: string): Output {
    return this.allSortMap.get(name);
   }

}

现在,如果我们想为getSortOutput编写测试,那么我们必须首先调用checkSort,但这是一个非常有限的测试,因为我们不能在getSortOutput上抛出各种allSortMap值来运用它。

我们确实将私人公开,然后我们可以彻底行使它们。 所以这确实有用......但

// Private Members
public allSort: Output[] = null;
public supportedSort: Output[] = null;
public allSortMap: Map<string, Output> = new Map<string, Output>();

这个问题的关键是我们可以模拟并传递私人价值观。在我们的TestBed配置中有类似的东西还是类似的?

providers: [SortService ,
 {provide: Output, name:"allSort", useValue: mockAllSort},
 {provide: Output, name:"supportedSort", useValue: mockSupportedSort},
 {provide: Map<string, Output>, name:"allSortMap", useValue: mockAllSortMap}]

TIA

1 个答案:

答案 0 :(得分:0)

正如@ R.Richards在其评论中所证实的那样,这是一个艰难的地方。目前,我们已经公开了这些价值观,因此我们可以进行测试。这对我们来说是可以接受的,因为它将被重构为不存在并且不会损害应用程序。