typescript - 使用 jasmine 进行代码覆盖的单元测试
问题描述
我有简单的记录器 .ts 文件。我正在尝试对此进行单元测试。如果有人帮助我修复我的单元测试。
记录服务.ts
import 'reflect-metadata'; // Required for tsyringe
import { singleton } from 'tsyringe';
import { Category } from 'typescript-logging';
@singleton()
export class Logger {
private logger: Category;
constructor(){
this.logger = new Category('oidc-security-logger');
}
trace(msg: string): void {
this.logger.trace(msg);
}
debug(msg: string): void {
this.logger.debug(msg);
}
info(msg: string): void {
this.logger.info(msg);
}
warn(msg: string): void {
this.logger.warn(msg);
}
error(msg: string, error?: Error): void {
if(error){
this.logger.error(msg, error);
} else {
this.logger.error(msg, null);
}
}
fatal(msg: string, error?: Error): void {
if (error) {
this.logger.fatal(msg, error);
} else {
this.logger.fatal(msg, null);
}
}
}
我尝试使用以下方法来完成我的单元测试。logging.service.spec.ts
import { Logger } from "./logging.service";
describe("Logger", () => {
let loggerMok: Logger;
beforeEach(() => {
loggerMok = new Logger();
});
it("should be test logger", () => {
const msg='This is for test';
spyOn(loggerMok,'trace').and.stub();
spyOn(loggerMok,'debug').and.stub();
spyOn(loggerMok,'info').and.stub();
spyOn(loggerMok,'warn').and.stub();
spyOn(loggerMok,'error').and.stub();
spyOn(loggerMok,'fatal').and.stub();
loggerMok.trace(msg);
loggerMok.debug(msg);
loggerMok.info(msg);
loggerMok.warn(msg);
loggerMok.error(msg);
loggerMok.fatal(msg);
expect(loggerMok.trace).toHaveBeenCalled();
expect(loggerMok.debug).toHaveBeenCalled();
expect(loggerMok.info).toHaveBeenCalled();
expect(loggerMok.warn).toHaveBeenCalled();
expect(loggerMok.error).toHaveBeenCalled();
expect(loggerMok.fatal).toHaveBeenCalled();
});
});
此单元测试运行良好,但代码覆盖率没有给出分数。
解决方案
您应该使用callThrough
而不是stub
. 当你stub
它不会调用实际的实现时,基本上只是忽略调用。查看方法存根了解更多信息。
当你使用callThrough
它时,它会调用实际的实现,从而增加覆盖率。所以你可以使用类似的东西:
it("should be test logger", () => {
const msg='This is for test';
spyOn(loggerMok,'trace').and.callThrough();
spyOn(loggerMok,'debug').and.callThrough();
spyOn(loggerMok,'info').and.callThrough();
spyOn(loggerMok,'warn').and.callThrough();
spyOn(loggerMok,'error').and.callThrough();
spyOn(loggerMok,'fatal').and.callThrough();
loggerMok.trace(msg);
loggerMok.debug(msg);
loggerMok.info(msg);
loggerMok.warn(msg);
loggerMok.error(msg);
loggerMok.fatal(msg);
expect(loggerMok.trace).toHaveBeenCalled();
expect(loggerMok.debug).toHaveBeenCalled();
expect(loggerMok.info).toHaveBeenCalled();
expect(loggerMok.warn).toHaveBeenCalled();
expect(loggerMok.error).toHaveBeenCalled();
expect(loggerMok.fatal).toHaveBeenCalled();
});
});
但是这个测试用例不是很有用,因为你所做的只是调用它然后检查它是否被调用。相反,我建议监视new Category
并检查是否已调用。
推荐阅读
- django - 如何从使用 django 中的 for 循环创建的表中获取日期输入?
- github - Swashbuckle.AspNetCore.Filters - 通过 XML 注释添加示例
- python - 安装 Odoo 要求时如何处理“给定双重要求”错误
- git - git 切换分支并拉取
- postgresql - 无法从外部登录到 Kubernetes 集群内部的 Postgres
- angular - 为什么下一行没有被单元测试覆盖?
- spring-boot - Spring Boot 微服务负载均衡与云负载均衡
- javascript - JavaScript:检测空格并计算字符长度
- javascript - LitElement 无限滚动重新定位问题
- anylogic - 为什么 3D 模型不以 2D 显示?