业力如何处理全局变量

时间:2019-06-18 17:05:47

标签: javascript typescript karma-jasmine karma-runner

我想尝试使用业力测试我的打字稿应用程序。 我的应用程序包含多个用作单例的类,例如:

export class MyService{
    private country: string = "USA";

    private constructor(){}
    private INSTANCE: MyService;
    public getInstance(){
        if(!this.INSTANCE){
           this.INSTANCE = new MyService();
           return this.INSTANCE;
        } 
        return this.INSTANCE;
    }
    public updateCountry(country: string){
        this.country = country;
    }
}

基本上可以编译为带有成员INSTANCE的全局变量MyService 我可以通过MyService.INSTANCE从浏览器的控制台进行调用。

我从两个要测试的类中使用此服务:

export class A{
  public set(){

    MyService.getInstance().updateCountry('France');
  }
}

和:

export class B{
  public get(){
    return MyService.getInstance().getCountry();
  }
}

我的测试是:

A:
describe('A Test Suite', () => {
   it('', () => {
       expect(MyService.getInstance().getCountry()).toEqual('USA');
       const a: A = new A();
       a.set();
       expect(MyService.getInstance().getCountry()).toEqual('France'); 
   });
});

B:
describe('B Test Suite', () => {
   it('get function should return USA', () => {
       const b: B = new B();
       expect(b.get()).toEqual('USA');
   });
});

现在,如果B的测试套件首先运行,则两个测试都将通过,但是如果A的测试套件将首先运行,A的测试将通过,但B的测试将失败,因为该国家的值现在是“法国” 是否存在一些我应该缺少的业力功能,应该清除测试之间的所有浏览器数据,或者采用其他方法来确保我的测试不会像这样耦合。 注意:MyService是我应用中的有效单例。 因为我希望这是一个集成测试,所以我不想对其进行模拟。

我很难相信Karma没有针对此类问题的解决方案,因为在Web应用程序中具有全局变量或单例很常见。

任何评论或建议将不胜感激。

0 个答案:

没有答案