【问题标题】:Is it ok to rewrite unit test in Javascript?用Javascript重写单元测试可以吗?
【发布时间】:2014-03-04 20:28:35
【问题描述】:

最近我开始对我正在开发的 JavaScript 应用程序进行单元测试。无论我使用 Jasmine、QUnit 还是其他,我总是编写一组测试。现在,我有我的源代码,可以说:

function calc()
{
    // some code
    someOtherFunction();
    // more code
}

我还有一个测试(无论是什么框架,使用 Jasmine 间谍或 sinon.js 或其他东西),确认在执行 calc() 时调用了 someOtherFunction()。测试通过。现在在某个时候我重构了 calc 函数,所以 someOtherFunction() 调用不存在,例如:

function calc()
{
    // some code
    someVariable++;
    // more code
}

之前的测试会失败,但是函数仍然会按预期运行,只是它的代码不同。

现在,我不确定我是否正确理解了测试是如何进行的。很明显,我将不得不回去重写测试,但如果发生这种情况,我的方法有问题吗?这是不好的做法吗?如果是这样,那我错了。

【问题讨论】:

  • 如果你的函数的行为仍然正确,那么你的测试是错误的。但是您的测试显然测试了 someOtherFunction 是否被调用。它不是。因此,您对构建测试的good behavior 的定义似乎存在缺陷。

标签: javascript unit-testing jasmine qunit


【解决方案1】:

一般规则是您不测试实现细节。因此,鉴于您认为可以删除调用,该方法是一个实现细节,因此您不应该测试它是否被调用。

20/20 事后诸葛亮不是吗?

一般来说,我不会测试一种称为“私有”的“公共”方法。当一个类调用另一个类时,应该保留测试委托。

【讨论】:

    【解决方案2】:

    你写了一个很棒的单元测试。

    当您更改实现时,单元测试应该注意到偷偷摸摸的副作用。 当预期值没有出现时,测试肯定会失败。

    因此,请查看预期值不匹配的单元测试并确定问题所在: 1)单元测试测试了它不应该测试的东西(改变测试) 2)代码被破坏(添加缺少的副作用)

    【讨论】:

    • 不,不是讽刺。一个好的单元测试会检查你的函数 calc() 的变化,并告诉你什么时候这些变化不再向下兼容。你认为 someOtherFunction();可以在不更改 calc() 的 api 的情况下替换。现在看来 someOtherFunction();更改您忘记的一些计数器/全局变量。
    【解决方案3】:

    重写这个测试就好了。许多测试在第一次通过时就无法完美。最常见的测试气味是与实现细节的紧密耦合。

    您的单元测试应该验证对象的行为,而不是它如何获得结果。如果您严格要求以 tdd 样式执行此操作,也许您应该还原您更改的代码并首先重构测试。但无论您使用什么技术,只要您将测试与被测系统的细节脱钩,就可以更改测试。

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      相关资源
      最近更新 更多