Angular spyOn isDevMode()角度为6+;单元测试?

Angular spyOn isDevMode()角度为6+;单元测试?,angular,unit-testing,jasmine,karma-jasmine,Angular,Unit Testing,Jasmine,Karma Jasmine,我的代码包括一个像这样的if块 服务: import { isDevMode } from '@angular/core'; export class MyService { constructor() {} methodToTest(): { if (!isDevMode()) { doSomething(); } else { doSomethingDifferentInDevMode(); } } } my-service.

我的代码包括一个像这样的
if

服务:

import { isDevMode } from '@angular/core';

export class MyService {
  constructor() {}

  methodToTest(): {
    if (!isDevMode()) {
      doSomething();
    } else {
      doSomethingDifferentInDevMode();
    }
  }
}
my-service.spec.ts(仅适用于相关行):


如何监视
isDevMode()
,使其在此单角度单元测试中返回false,以便我可以测试调用了
doSomething()

看起来答案在注释中。谢谢@JBNizet

// 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();
    }
  }
}

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

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 = TestBed.inject(DevModeService);
  spyOn(devModeService, 'isDevMode').and.returnValue(true);

  const myService = TestBed.inject(MyService);
  myService.methodToTest();
  // ...
}

it('should do something else when in prod mode') {
  const devModeService = TestBed.inject(DevModeService);
  spyOn(devModeService, 'isDevMode').and.returnValue(false);

  const myService = TestBed.inject(MyService);
  myService.methodToTest();
  // ...
}

isDevMode()的定义方式和位置。发布相关代码。将调用封装到服务方法中,注入服务,并在测试中监视服务方法。我发布了一个答案。效果非常好!非常感谢。
it('should do something when in dev mode') {
  const devModeService = TestBed.inject(DevModeService);
  spyOn(devModeService, 'isDevMode').and.returnValue(true);

  const myService = TestBed.inject(MyService);
  myService.methodToTest();
  // ...
}

it('should do something else when in prod mode') {
  const devModeService = TestBed.inject(DevModeService);
  spyOn(devModeService, 'isDevMode').and.returnValue(false);

  const myService = TestBed.inject(MyService);
  myService.methodToTest();
  // ...
}