最近我开始对我正在开发的JavaScript应用程序进行单元测试。无论我使用Jasmine,QUnit还是其他我总是写一组测试。现在,我有源代码,让我们说:
function calc()
{
// some code
someOtherFunction();
// more code
}
我还有一个测试(无论是什么框架,使用Jasmine spies或sinon.js等)确认someOtherFunction()
在执行calc()
时被调用。测试通过。现在在某些时候我重构了calc函数,因此someOtherFunction()
调用不存在,例如:
function calc()
{
// some code
someVariable++;
// more code
}
之前的测试将失败,因为该功能仍将按预期运行,只是它的代码不同。
现在,我不确定我是否正确理解测试是如何完成的。很明显,我将不得不回去重写测试,但如果发生这种情况,我的方法有问题吗?这是不好的做法吗?如果是这样的话我就错了。
答案 0 :(得分:0)
一般规则是您不测试实现细节。因此,鉴于您决定删除调用是可以的,该方法是一个实现细节,因此您不应该测试它被调用。
20/20后见之明很棒的事情不是吗?一般来说,我不会测试一种称为“私有”方法的“公共”方法。当一个类调用另一个类时,应保留测试委托。
答案 1 :(得分:0)
你写了一篇很棒的单元测试。
当您更改实施时,单元测试应该注意到偷偷摸摸的副作用。 当预期值没有显示时,测试必须失败。
因此,请查看单位测试中预期值不匹配的位置,并确定问题所在: 1)单元测试测试不应该的东西(改变测试) 2)代码被破坏(添加缺少的副作用)
答案 2 :(得分:0)
重写此测试很好。许多测试在第一次通过时都不完美。最常见的测试气味是紧密耦合实现细节。
您的单元测试应验证对象的行为,而不是如何实现结果。如果您严格按照tdd样式执行此操作,可能应该还原您更改的代码并首先重构测试。但无论您使用何种技术,只要您将测试与被测系统的细节分离,就可以更改测试。