如何模拟包含静态变量的服务?

时间:2019-05-06 14:06:21

标签: angular unit-testing jasmine

我有一个问题吗?如何模拟包含静态变量的服务?

这是我的服务

@Injectable()


export class AppConfigService {

    static settings: IAppConfig;
    constructor(private http: HttpClient) {}

    load() {
        const jsonFile = `assets/config/config.${environment.name}.json`;
        return new Promise<void>((resolve, reject) => {
            this.http.get(jsonFile).toPromise().then((response: IAppConfig) => {
                AppConfigService.settings = response as IAppConfig;
                resolve();
            }).catch((response: any) => {
                reject(`Could not load file '${jsonFile}': ${JSON.stringify(response)}`);
            });
        });
    }
}

这是我的单元测试代码:

describe('AppConfigService', () => {
    let service: AppConfigService;
    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [
                HttpClientTestingModule
            ],
            providers: [
                {provide: AppConfigService, useClass: MockAppConfigService}
            ]});
        service = TestBed.get(AppConfigService);
    });

    it('should be created', () => {
        expect(service).toBeTruthy();
    });
    it('should ran load well', () => {
        expect(service.settings)......;
    });

我不能使用service.settings,因为设置是AppConfigService的静态成员……

1 个答案:

答案 0 :(得分:0)

您的榜样让我很困惑。用模拟替代喷油器时,如何测试服务。 但是仅考虑您的问题,我就无法知道。对静态成员的访问不能被覆盖,只能覆盖其内容。在您的AppConfigService示例中,您可以通过提供root用户来将此服务限定为单例:

@Injectable({
  providedIn: 'root'
})

现在,只要您测试依赖于应用程序配置的内容,就可以轻松模拟此服务。