Javascript 我应该如何对有大量重叠的代码进行单元测试?

Javascript 我应该如何对有大量重叠的代码进行单元测试?,javascript,unit-testing,testing,tdd,Javascript,Unit Testing,Testing,Tdd,我对单元测试比较陌生。我正在编写一个小的JavaScript库,其中我优先考虑了一个友好的API,为了方便使用,这会导致一些方法重叠 作为一个简单的假设例子,考虑如下: var BasicMath = function() {}; BasicMath.prototype.multiply = function(numA, numB) { return numA * numB; }; BasicMath.prototype.square = function(num) { return

我对单元测试比较陌生。我正在编写一个小的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()
    的冗余
或者,其他方法


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

使用jasmine和sinon的例子:

与任何其他方法一样进行乘法测试:

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);
}

这样做的目的是使用存根创建一个可复制的环境,存根总是希望调用具有两个相同的参数(在本例中为2和2),该参数测试正方形是否发送
num
num
(而不是
num
num+1
),并返回调用的结果进行乘法(您可以告诉存根返回
'banana'
并检查
'banana'
,重要的是
平方
返回
返回的值)

谢谢!这非常有帮助。很抱歉,接受这个答案花了这么长时间。