如何在Jasmine中使用静态成员初始化类

时间:2017-09-17 01:30:20

标签: angular cordova typescript jasmine ionic3

我有一个Angular应用程序(Ionic / Cordova),我有一个" Utils"使用各种简单的misc静态方法的类。

由于这个类是静态的,我使用initialize()方法传递一些依赖项(也许这不是最佳实践,但在这种情况下,有这个"静态类"使有些事情在应用程序中更容易。

无论如何,我希望测试一些静态方法,其中一些可能依赖于通过initialize()方法设置的这些静态依赖项。

所以Utils.initialize看起来像这样..

 export class Utils {    
   private static platform : Platform;
   private static appVersion : AppVersion;
   private static device : Device;
   private static translate : TranslateService;  

  public static initialize(appVersion : AppVersion, device : Device, platform : Platform, translate : TranslateService){
        Utils.appVersion = appVersion;
        Utils.device = device;
        Utils.platform = platform;
        Utils.translate = translate;    
      }

并调用其中一个使用translate

的方法
    public static compareNoCase(s1 : string, s2 : string) : number {
        ....    
        return s1.localeCompare(s2, Utils.translate.currentLang, {'sensitivity': 'base'});
      }

在这种情况下,我传入一个Translate服务,其中一些字符串比较调用使用此翻译服务器中的属性language,如上所述>我嘲笑TranslateService`如下......

export class TranslateServiceMock {
  public currentLang: string = "en";
}

我可以使用以下内容让这个工作......

    describe('Test Compare String IgnoreCase', () => {
        beforeEach(async () => {
          language
          TestBed.configureTestingModule({
            declarations: [],
            providers: [
              { provide: TranslateService, useClass: TranslateServiceMock },
            ],
           }).compileComponents();     
        });

        it('Expected AAAA < bbbb', inject([TranslateService], trans => {
          Utils.initialise(new AppVersion(), new Device(), new Platform(), trans);
          let r = Utils.compareNoCase("AAAA", "bbbb");
          expect(r).toEqual(-1);
        }));

但是,使用上述内容,我需要将行Utils.initialise(new AppVersion(), new Device(), new Platform(), trans);传递到每个it块中。

我希望能做到这一点&#34;静态初始化&#34;在beforeEach()中,所以我尝试了以下内容,我在then()的调用返回的承诺的compileComponents()中进行了初始化....

    describe('Test Compare String IgnoreCase', () => {
        beforeEach(async () => {             
          TestBed.configureTestingModule({
            declarations: [],
            providers: [
              { provide: TranslateService, useClass: TranslateServiceMock },
            ],
           }).compileComponents()
          .then(_ => {
             inject([TranslateService], trans => {
               Utils.initialise(new AppVersion(), new Device(), new Platform(), trans)
             });
          });
        });

        it('Expected AAAA < bbbb', inject([TranslateService], trans => {     
          let r = Utils.compareNoCase("AAAA", "bbbb");
          expect(r).toEqual(-1);
        }));

但是当我使用上面的静态属性时,测试中的方法正在访问,即通过initialize()传递的translate服务的静态引用为null。

有没有办法做到这一点&#34;静态初始化&#34;,或者我只需要像每个代码片段一样将它包含在每个测试中吗?

提前感谢您的帮助!

0 个答案:

没有答案