【问题标题】:I don't understand Unit Tests我不懂单元测试
【发布时间】:2013-12-16 20:42:12
【问题描述】:

所以我正在尝试做一些单元测试,但我完全迷失了。 这是我的功能:

showNotification = function(notificationBoxElement, validationErrorObject) {
    notificationBoxElement.show();
    notificationBoxElement.find('div div:last-of-type ul').empty();
    for(var inputLabel in validationErrorObject) {
        if(validationErrorObject.hasOwnProperty(inputLabel)) {
            notificationBoxElement.find('div div:last-of-type ul').append('<li><strong>' + inputLabel + ': </strong>' + validationErrorObject[inputLabel] + '<span></span></li>');
        }
    }
    notificationBoxElement.addClass('alert-danger');
};

我正在将 Jasmine 与 Karma 测试运行器一起使用。我的问题是我到底应该测试什么?理想情况下,我希望我的测试尽可能地健壮,所以我想测试 DOM?论据?如果我测试 DOM,我要测试什么?我是否测试 li 是否插入到 ul 中,有多少以及它们是否有正确的文本?我是否测试该元素现在是否因为显示功能而可见?

如果我正在测试参数,我应该测试所有可能的值吗?或者我应该只测试notificationBoxElement 是一个dom 元素而validationErrorObject 是一个对象吗?如果我只能测试validationErrorObject 是否是一个对象,为什么还要尝试使用所有可能的参数值来检查结果?很多东西我不明白,请帮帮我!!

【问题讨论】:

标签: javascript unit-testing jasmine karma-runner


【解决方案1】:

您想测试代码的作用。

用于测试您的代码正在执行的 DOM 操作。你有几个选择。

  1. 监视 JQuery 函数并确保它们被调用。您将为show()empty()append() 等创建一个间谍。并确保调用它们并使用正确的参数。这样做的缺点是你依赖于 jQuery,并且会使你的测试变得复杂。
  2. 您可以将元素附加到 DOM 并确保对这些元素进行操作。因此,在您的测试中,您将添加一个beforeEach 函数,该函数在调用该函数之前将DOM 的元素设置为您想要的初始状态。然后在您的测试中确保属性被正确修改(即元素现在可见,一个被清空,并添加了正确的子元素)。然后,您可以使用 afterEach 方法从测试结果页面中删除这些元素。

至于你传递给你的函数的参数,你希望是全面的。因此,您希望传入会导致功能更改的参数。

根据您的操作,我会使用第二个选项,因为它与任何特定代码无关。您可以在不破坏测试并确保您的代码仍然正常运行的情况下重构您的 javascript。例如,您将传递一个空对象和一个具有多个错误属性的对象,以确保您处理附加信息。

【讨论】:

  • 谢谢! DOM 操作测试部分很清楚,但我仍然对如何测试参数感到困惑。
  • 您可以控制参数,无需“测试”它们。您将它们传递进来,以便将 DOM 元素和一个对象传递到您的函数中,并确保事情正确发生。在测试时,将函数/类方法视为黑盒。对于一组给定的输入,您检查以确保提供给定的输出。
【解决方案2】:

单元测试应该测试小的孤立问题。你应该为你在问题中提到的每一部分写一个测试。很多时候,您最终会进行多个测试来涵盖相同的功能。

覆盖率是一种常用指标,用于衡量您的代码的测试效果。我对 Karma 不熟悉,但大多数测试框架都有一个覆盖命令,它会告诉你测试覆盖了多少代码。

随着时间的推移,您将开始更好地了解如何高效地编写测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多