我对单元测试比较新。我正在编写一个小型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()
的冗余?或者,其他一些方法?
请记住,上面的代码只是一个人为的例子 - 我提出了一个关于如何使用重叠/冗余功能对测试方法进行单元化的更一般性问题。
答案 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),它测试该正方形发送num
和num
(而不是num
和num + 1
),并将调用结果返回到multiply(您可以告诉存根返回'banana'
并检查{{ 1}},重要的是'banana'
会返回square
返回的内容。