2014-10-18 41 views
0

我对单元测试比较陌生。我正在编写一个小型的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

例使用茉莉和兴农:

测试乘以像任何其他方法:

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(而不是num和例如num + 1),并返回调用的结果乘以(您可以告诉存根要返回'banana'并检查'banana',重要的是square返回任何multiply返回)

相关问题