开玩笑 - spyOn 没有代码覆盖实际实现

Posted

技术标签:

【中文标题】开玩笑 - spyOn 没有代码覆盖实际实现【英文标题】:Jest - spyOn does not code cover actual implementation 【发布时间】:2020-08-11 00:43:23 【问题描述】:

我正在为 Typescript 进行 Jest 单元测试,我创建了一个方法

addNumbers:() 
     return 6;

它只是一种用于测试目的的静态测试方法。

我使用 jest 创建了一个单元测试

spyOn(object, 'addNumbers').mockReturnValue(6);
expect(object.addNumbers).toHaveBeenCalled(); // expect is success

单元测试工作正常,但在检查代码覆盖率时“返回 6;”不包括在内。

不确定缺少什么、配置或任何其他问题。

因为一旦这样工作,需要在实际代码中实现。

如果需要任何其他信息,请告诉我。

在此先感谢...

【问题讨论】:

【参考方案1】:

spyOn(object, 'addNumbers').mockReturnValue(6);

这里你已经模拟了函数,这就是你原来的函数没有被调用的原因。

就这样使用,不要只模拟spyOn

const addNumbersSpy = spyOn(object, 'addNumbers')
expect(addNumbersSpy).toHaveBeenCalled()

【讨论】:

你好@user1263961你能检查答案,如果它适合你,让它正确。 嗨Dinindu,我尝试了上述步骤并且单元测试通过了,我的实际问题是,检查代码覆盖率时,方法中的行没有被覆盖。 嗨 @user1263961 在你的测试中你必须调用 addNumbers 函数否则它不会覆盖 请在此处添加完整的测试 Main.ts code export class Main addNumber(a: number, b: number) return a + b; 导出默认主; Main.spec.ts code import Main from './main' describe('Add Number', () => test('sum', () => let a = new Main(); let b = jest.spyOn(a, 'addNumber').mockReturnValue(3).mockImplementation(() => 3); expect(a.addNumber(1, 2)).toEqual(3) ) )【参考方案2】:

实际代码和代码覆盖率图像。使用 mock 覆盖了代码

主代码:

export class Main 
addNumber(a: number, b: number) 
    return a + b;

export default Main;

单元测试代码

import  Main  from './main'
describe('Add Number', () => 
test('sum', () => 
    let a = new Main();
    let b = jest.spyOn(a, 'addNumber').mockReturnValue(3).mockImplementation(() => 3);
    expect(a.addNumber(1, 2)).toEqual(3)
)
)

单元测试覆盖率

【讨论】:

【参考方案3】:

这是一个死问题,但我认为写一个解释以防万一以后有人偶然发现这个问题(就像我一样)。

我相信您所观察到的是预期行为 - 如果您在测试中模拟一个函数,那么被模拟的函数实际上并没有被调用。我不希望代码覆盖率报告中涵盖测试中未执行的代码。

听起来您对如何实际测试您的方法感到困惑;来自Main 类的addNumber 方法的单元测试如下所示:

import  Main  from './main'
describe('Add Number', () => 
  test('sum', () => 
    // Arrange
    let main = new Main();
    // Act
    let result = a.addNumber(1, 2);
    // Assert
    expect(result).toEqual(3)
  )
)

Mocks 是一种帮助您测试代码的实用程序 - 模拟本身并不意味着要进行测试。

【讨论】:

这与给定答案没有什么不同

以上是关于开玩笑 - spyOn 没有代码覆盖实际实现的主要内容,如果未能解决你的问题,请参考以下文章

如何开玩笑地从覆盖报告生成中删除快照的考虑

开玩笑 - 使用 spyOn 函数时,确保不调用被监视的函数

开玩笑覆盖率,所有值为零

开玩笑覆盖率:我怎样才能获得覆盖率的总百分比?

用于 Typescript 的 Sonarqube 上未显示代码覆盖率

使用 Jasmine 进行 Angular 单元测试:如何删除或修改 spyOn