【问题标题】:Jest - spyOn does not code cover actual implementation开玩笑 - spyOn 没有代码覆盖实际实现
【发布时间】: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;”不包括在内。

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

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

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

在此先感谢...

【问题讨论】:

    标签: typescript jestjs code-coverage


    【解决方案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 是一种帮助您测试代码的实用程序 - 模拟本身并不意味着要进行测试。

      【讨论】:

      • 这与给定答案没有什么不同
      猜你喜欢
      • 2019-07-31
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 2018-05-31
      • 2017-07-15
      • 1970-01-01
      • 2020-01-12
      相关资源
      最近更新 更多