代码之家  ›  专栏  ›  技术社区  ›  Jeremy Moritz Igal S.

Spyon IsDevMode()在Angular 6+单元测试中?

  •  1
  • Jeremy Moritz Igal S.  · 技术社区  · 8 年前

    我的代码包括 if 像这样阻挡

    服务:

    import { isDevMode } from '@angular/core';
    
    export class MyService {
      constructor() {}
    
      methodToTest(): {
        if (!isDevMode()) {
          doSomething();
        } else {
          doSomethingDifferentInDevMode();
        }
      }
    }
    

    my-service.spec.ts(仅限相关行):

    it('should run doSomething() when isDevMode() returns false', () => {
      // what should i do here to mock a false value return for isDevMode() ?
      expect(doSomething).toHaveBeenCalled();
    });
    

    我怎么监视 isDevMode() 为了让它在这个单角度单位测试中返回错误,我可以测试它 doSomething() 是否被调用?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Jeremy Moritz Igal S.    8 年前

    首先将此函数包装到服务中:

    import { isDevMode, Injectable } from '@angular/core';
    
    @Injectable({ providedIn: 'root' })
    export class DevModeService {
      constructor() {}
    
      isDevMode() {
        return isDevMode();
      }
    }
    

    然后,您可以在任何需要的地方注入此服务,就像处理任何其他服务一样:

    import { DevModeService } from 'dev-mode.service';
    
    export class MyService {
      constructor(private devModeService: DevModeService) {}
    
      methodToTest(): {
        if (!this.devModeService.isDevMode()) {
          doSomething();
        } else {
          doSomethingElse();
        }
      }
    }
    

    然后您可以在测试myservice时监视devmodeservice,就像处理任何其他依赖项一样:

    it('should do something when in dev mode') {
      const devModeService: DevModeService = TestBed.get(DevModeService);
      spyOn(devModeService, 'isDevMode').and.returnValue(true);
    
      const myService: MyService = TestBed.get(MyService);
      myService.methodToTest();
      // ...
    }
    
    it('should do something else when in prod mode') {
      const devModeService: DevModeService = TestBed.get(DevModeService);
      spyOn(devModeService, 'isDevMode').and.returnValue(false);
    
      const myService: MyService = TestBed.get(MyService);
      myService.methodToTest();
      // ...
    }
    
        2
  •  0
  •   robrich    8 年前

    答案似乎在评论中。谢谢@jbinzet。

    // dev-mode-service.ts
    
    import { isDevMode } from '@angular/core';
    
    export class DevModeService {
      constructor() {}
    
      isDevMode(): {
        return isDevMode();
      }
    }
    
    
    // MyService.ts
    
    import { isDevMode } from 'dev-mode-service';
    
    export class MyService {
      constructor() {}
    
      methodToTest(): {
        if (!isDevMode()) {
          doSomething();
        } else {
          doSomethingDifferentInDevMode();
        }
      }
    }
    
    推荐文章