angular - Angular 6+ 单元测试中的 spyOn isDevMode()?
问题描述
我的代码包括这样的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();
});
我如何 spyOnisDevMode()
让它为这个单一的 Angular 单元测试返回 false,以便我可以测试doSomething()
被调用的?
解决方案
首先将此函数包装到服务中:
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();
// ...
}
推荐阅读
- python - 在 python 中查找朋友的生日
- image - 我正在使用带有 raspian stretch lite 的树莓派 3。我创建的文件保存在哪里?
- javascript - 显示单击的特定项目列表的子内容。
- python - 如何在 linux ubuntu 上使用安装模块?
- android - net::ERR_FILE_NOT_FOUND 加载以锚定新版本的 WebView
- javascript - 在没有 react-ga 的 React 中使用 analytics.js
- r - 满足条件的天数的运行计数
- jquery - 为什么当我点击某个按钮时我的页面会刷新?
- ruby-on-rails - 在 Rails 中使用 ajax 将表格行编辑为表单字段
- applescript - AutoMator 的简单 AppleScript