You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript单元测试疑问:调用依赖函数的测试是否为集成测试?

单元测试 vs 集成测试:你的测试到底算哪一类?

首先直接给你答案:如果你的测试在调用函数A时,用的是真实的函数B而没有做任何隔离,那这确实是集成测试,不是单元测试——你的怀疑是对的!

咱们拆开说清楚:

  • 单元测试的核心是「隔离」:单元测试只需要验证被测函数(这里是A)自身的逻辑是否正确。对A来说,它的职责就是接收参数i,计算出i+1,然后调用B并返回B的结果。至于B能不能正确返回i+1,那是B自己的单元测试该关心的事,和A的单元测试无关。所以做A的单元测试时,你需要把B给「mock掉」(也就是用一个假的B函数代替),只需要验证A有没有正确调用B、传的参数对不对,以及是否返回了B的结果就行。

  • 集成测试则是验证「协作」:如果你的测试直接让A调用真实的B,那你其实是在验证A和B这两个单元一起工作时,最终的输出是否符合预期——这就是集成测试的范畴了。它关注的是多个单元之间的交互是否正常,而不是单个单元的独立逻辑。

举个例子,结合你的代码来看:

假设你原来的测试是这样的(典型的集成测试):

const { assert } = require('chai');
const { A } = require('./your-module');

describe('Function A', () => {
  it('should return the correct value', () => {
    assert.equal(A(1), 3);
    assert.equal(A(5), 7);
  });
});

这个测试依赖了B的真实实现,如果B的逻辑变了(比如改成返回i+2),A的测试也会失败——这就说明它不是独立的单元测试。

而正确的单元测试应该是这样的(用Sinon来mock B):

const { assert } = require('chai');
const sinon = require('sinon');
const { A, B } = require('./your-module');

describe('Function A', () => {
  it('should call B with i+1 and return its result', () => {
    // 先把B替换成一个mock函数,指定它的返回值
    const mockB = sinon.stub(B).returns(10);
    
    // 调用A
    const result = A(4);
    
    // 验证A是否正确调用了B,参数是4+1=5
    assert.isTrue(mockB.calledOnceWith(5));
    // 验证A返回的是mockB给出的结果
    assert.equal(result, 10);
    
    // 测试完恢复原函数,避免影响其他测试
    mockB.restore();
  });
});

这个测试完全不关心B的真实逻辑,只关注A自己的行为——这才是真正的单元测试。

所以你之前的测试确实属于集成测试,这也解决了你论文里的困扰。你可以在论文里明确区分这两种测试的差异,说明你如何调整测试策略来覆盖单元测试和集成测试的场景,这样会让你的内容更严谨。

内容的提问来源于stack exchange,提问作者FabianTe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:20:29