我想尝试使用业力测试我的打字稿应用程序。 我的应用程序包含多个用作单例的类,例如:
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应用程序中具有全局变量或单例很常见。
任何评论或建议将不胜感激。