【问题标题】:Unit Test With Code coverage using jasmine使用 jasmine 进行代码覆盖的单元测试
【发布时间】:2021-09-10 19:13:41
【问题描述】:

我有简单的记录器 .ts 文件。我正在尝试对其进行单元测试。如果有人帮助我修复我的单元测试。

logging.service.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();

});
});

这个单元测试运行良好,但代码覆盖率没有给出分数。

【问题讨论】:

    标签: typescript unit-testing jasmine code-coverage spy


    【解决方案1】:

    您应该使用callThrough 而不是stub。当你stub 它不会调用实际的实现,基本上只是忽略调用。查看Method stubs 了解更多信息。

    当您使用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 并检查它是否已被调用。

    【讨论】:

    • 感谢您的快速回复。我已完成您的建议。给出良好的突变分数 87.50%,但代码覆盖率 54.17%。
    • 也可以调用 loggerMok.error(msg, error); loggerMok.fatal(msg, error) 增加覆盖率
    • 是的,我已经完成了,目前的分数是 100%
    • spyOn(loggerMok, 'fatal').and.callThrough(); loggerMok.fatal(味精,错误);期望(loggerMok.fatal).toHaveBeenCalled(); loggerMok.fatal(味精);期望(loggerMok.fatal).toHaveBeenCalled();
    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2022-11-12
    • 2020-06-02
    • 2012-01-18
    • 2010-10-14
    相关资源
    最近更新 更多