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

时间:2014-10-18 04:00:41

标签: 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 this.multiply(num, num);
};

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

请注意,.square()只是一种方便的方法,除了将其参数两次传递给.multiply()之外什么都不做。

考虑到这一点,我应该:

  • 为这两种方法编写类似(甚至相同)的单元测试?
  • 测试.square()是否使用某些参数调用.multiply()? (我的理解是这是不好的做法,因为它过分依赖于方法的实现细节。)
  • 根本没有测试.square(),因为它对.multiply()基本上是多余的?
  • 仅测试.square()的更一般方面(如参数类型,数量等),以避免.multiply()的冗余?

或者,其他一些方法?

请记住,上面的代码只是一个人为的例子 - 我提出了一个关于如何使用重叠/冗余功能对测试方法进行单元化的更一般性问题。

1 个答案:

答案 0 :(得分:1)

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

你要做的是使用存根创建一个可重现的环境,它总是希望调用具有两个相同的args(在这种情况下为2和2),它测试该正方形发送numnum(而不是numnum + 1),并将调用结果返回到multiply(您可以告诉存根返回'banana'并检查{{ 1}},重要的是'banana'会返回square返回的内容。