开玩笑 - 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.tscode
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 函数时,确保不调用被监视的函数