我应该如何对有很多重叠的代码进行单元测试

How should I unit test code with a lot of overlap?

本文关键字:代码 单元测试 重叠 我应该      更新时间:2023-09-26

我对单元测试相对陌生。我正在编写一个小型JavaScript库,在其中我优先考虑了一个友好的API,这导致了一些方法重叠,以方便使用。

作为一个简单的假设示例,考虑以下内容:

var BasicMath = function() {};
BasicMath.prototype.multiply = function(numA, numB) {
  return numA * numB;
};
BasicMath.prototype.square = function(num) {
  return this.multiply(num, num);
};

我应该如何对该代码进行单元测试?

注意,.square()只是一个方便的方法,它只会将参数传递给.multiply()两次。

考虑到这一点,我应该:

  • 为两种方法编写相似(甚至相同)的单元测试
  • 测试.square()用某些参数调用.multiply()?(我的理解是,这是一种糟糕的做法,因为它过于依赖于方法的实现细节。)
  • 根本不测试.square(),因为它本质上是.multiply()的冗余
  • 只测试.square()的更通用的方面(如参数类型、数量等),以避免与.multiply()的冗余

或者,其他方法?

请记住,上面的代码只是一个人为的例子——我问的是一个更一般的问题,关于如何对具有重叠/冗余功能的方法进行单元测试。

使用茉莉花和西农的示例:

像任何其他方法一样测试乘法:

it('multiplies two numbers', function () {
    math = new BasicMath();
    expect(math.multiply(2,3)).toBe(6);
}

使用square,您想测试它是否调用multiply,将num的值作为两个参数传递,并返回multiply返回的结果,而不执行任何其他逻辑:

it('squares a number', function () {
    math = new BasicMath();
    math.multiply = sinon.stub();
    math.multiply.withArgs(2,2).returns(4);
    expect(math.square(2)).toBe(4);
}

这样做的目的是使用存根创建一个可复制的环境,存根总是期望调用具有两个相同的args(在本例中为2和2),这将测试square发送numnum(而不是numnum + 1),并返回乘法调用的结果(您可以告诉存根返回'banana'并检查'banana',重要的是square返回multiply返回的任何值)