我有一个班级,我正在编写测试。提前我的上司和我都认识到这是重构的候选人,并且它已被添加到积压中。与此同时,我们正在寻找快速解决方案。
问题在于,类中的许多方法都使用私有变量。但是,除非先调用一个特定方法,否则它们为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
答案 0 :(得分:0)
正如@ R.Richards在其评论中所证实的那样,这是一个艰难的地方。目前,我们已经公开了这些价值观,因此我们可以进行测试。这对我们来说是可以接受的,因为它将被重构为不存在并且不会损害应用程序。