Javascript 我应该如何对有大量重叠的代码进行单元测试?
我对单元测试比较陌生。我正在编写一个小的JavaScript库,其中我优先考虑了一个友好的API,为了方便使用,这会导致一些方法重叠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
作为一个简单的假设例子,考虑如下:
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'
,重要的是平方
返回乘
返回的值)谢谢!这非常有帮助。很抱歉,接受这个答案花了这么长时间。