如何在没有逻辑的情况下对单元测试类?

时间:2015-04-16 03:03:40

标签: unit-testing tdd

我发现为算法编写单元测试很容易。例如,sort(List),很容易编写如下测试:

list = [2, 1, 4];
assert(sort(list) == [1, 2, 4]);

但我发现很难测试没有逻辑的方法,没有if语句,只有一组调用。

我主要有2个例子可以解答如何对它们进行单元测试:

示例1:

假设我有一个负责将一些数据写入文件的类,但该数据是由外部函数(writeHeaderToFilewriteSerializedData和{以特定方式编写的。 {1}})。

数据不是直接写入文件,因此如果数据类似于:

writeEndOfFile

这并不意味着该文件既不是该数据的普通版本(没有空格),也不是简单的序列化版本或加密版本到文件中。实际的文件二进制文件将是我不知道的东西。我所知道的是,我可以使用这3种方法以正确的方式书写。

此文件还包含一些其他信息,这些信息并非直接来自这3种方法,例如特定类型的标题(同样,我不知道它将如何在文件二进制文件中表示)。

这是班级:

{
    list: [
        "item 1",
        "item 2"
    ],
    name: "aaa"
}

示例2:

class FileCreator {
    populateFileWithData(File file, Data data) {
        doBlockWithLock(file, {
            Header header;
            header.format = SomeFormat;
            header.version = SomeVersion;
            writeHeaderToFile(file, header);

            writeSerializedData(file, data);

            writeEndOfFile(file);
        });
    }

    // Private
    void doBlockWithLock(File file, Lambda block) {
        file.holdWritingLock();
        block();
        file.releaseWritingLock();
    }
}

对于这个我可以做这样的事情:

class Controller {

    var screenOne = new ScreenOne();
    var screenTwo = new ScreenTwo();
    var screenThree = new ScreenThree();

    void reloadButtonWasClicked() {
        screenOne.reload();
        screenTwo.reload();
        screenThree.reload();
    }
}

但我不会发现它有多大价值,因为我只是断言我做的是我在实施中所做的同样的事情。好像代码重复给我。


测试我的两个例子的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

在第一个示例中,如果您编写了有问题的消息并对测试覆盖率感到满意,则没有理由在FileCreator上重现该测试逻辑。您只需要测试FileCreator populateFileWithData方法以确保写入文件,并且锁定机制可能正常工作。

你是对的,你的最后一次测试是相当微不足道的。我很想省略写作。但这取决于。是否有人可能会出现并评论其中一个面板构造函数?你有其他测试可以识别这样的问题吗?