我应该如何对有很多重叠的代码进行单元测试
How should I unit test code with a lot of overlap?
我对单元测试相对陌生。我正在编写一个小型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()
的冗余
或者,其他方法?
请记住,上面的代码只是一个人为的例子——我问的是一个更一般的问题,关于如何对具有重叠/冗余功能的方法进行单元测试。
使用茉莉花和西农的示例:
像任何其他方法一样测试乘法:
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),这将测试square发送num
和num
(而不是num
和num + 1
),并返回乘法调用的结果(您可以告诉存根返回'banana'
并检查'banana'
,重要的是square
返回multiply
返回的任何值)
相关文章:
- 如何使用KARMA对React JSX ES6代码进行单元测试
- 如何在单元测试中使用此JavaScript代码
- 单元测试Angular自举代码
- 在C#中,我如何对客户端用户交互和javascript(jQuery)代码进行单元测试
- 在单元测试中实现逻辑,以缩短语法并提高测试代码的可重用性
- 如何使用 Jest 编写单元测试,用于 Promise 的代码
- 什么是JavaScript单元测试的代码覆盖率的分支
- 如何对此代码进行单元测试
- 我应该如何对有很多重叠的代码进行单元测试
- 浏览器单元测试的代码覆盖率
- 如何确保Jasmine单元测试中的DRY代码
- 我应该为客户端和服务器代码使用不同的单元测试框架吗
- 单元测试Mootools代码的最佳解决方案
- Jenkins/SonarQube单元测试JavaScript的代码覆盖率
- 使用Jasmine进行单元测试:测试没有看到beforeEach()中的代码's spyOn()
- 如何使用Mocha Chai组织用于单元测试BDD的代码
- JavaScript单元测试变量和代码未封装在函数中
- 如何对动态加载javascript文件的javascript代码进行单元测试
- 单元测试javascript代码风格
- visual studio 2015 -在MSBuild中集成javascript单元测试代码覆盖