单元测试 - 何时/如何存根?

时间:2016-11-21 21:09:53

标签: javascript unit-testing

我正在努力改进我的代码的单元测试 - 包括尝试一些tdd。我有一个问题是我应该如何测试解析csv文件的对象。让我举个小例子......

class EventLog {
    parse() {
        // load csv file, create array of Events
    }

    getEvents(options) {
        // depending on options, return correct set of events
    }
}

class Event {}

首先,我想为我的getEvents方法编写测试,以确保不同的选项产生正确的结果。在这种情况下,我是否要为解析创建一个存根,我可以传递一组Events,然后对该数据集运行我的测试?

其次,我需要测试解析方法。计划测试简单的事情,比如文件不存在,格式与预期不符,创建正确Events等。为此,我应该存储一些涵盖案例的样本.csv文件需要?或者将loadCsv()方法拉出来并将其更加有效?

1 个答案:

答案 0 :(得分:1)

班级使用有多难?

如果它很简单,就像解析器需要一些字符串一样,那么你可以考虑直接使用它。使用ES6类,您甚至可以声明新的class TestEventLog extends EventLog并将继承用作最小存根。这是最少的开销,是我最喜欢的策略。

如果类特别复杂,请记住,通过小型(单元)测试,您需要关注一小部分代码。如果你看到从一个你没有测试过的类中调用了大量的方法,那就是测试不良的气味。

在这种情况下,我可能会从继承和替换开始:

class TestEventLog extends EventLog {
  parse() {
    // ignore arguments, return known test data
    return [['foo', 1], ['bar', 2]];
  }
}

指导原则应该是尽可能少地引入代码。您编写的支持测试的代码越多,您需要测试的代码就越多。