使用流测试类

时间:2010-09-01 17:13:09

标签: unit-testing testing

我感兴趣的是为公共API涉及某种流程的类编写单元测试的最佳方法,例如:

public class PaginatedWriter {
public void AppendLine(string line) { ... }
public IEnumerable<string> GetPages() { ... }
public int LinesPerPage { get; private set; }
}

此类将文本行分页为每页给定的行数。为了测试这个课程,我们可能会有类似的内容:

public void AppendLine_EmptyLine_AddsEmptyLine() { ... }
public void AppendLine_NonemptyLine_AddsLine() { ... }
public void GetPages_ReturnsPages() {
 writer.AppendLine("abc");
 writer.AppendLine("def");
 var output = writer.GetPages();
 ...
}

现在,我的问题是:即使我们正在测试GetPages()方法,也可以在最后一个测试方法中调用AppendLine()吗?

我知道在这种情况下的一个解决方案是使AppendLine()虚拟并覆盖它,但问题是AppendLine()操纵内部状态,我认为这不应该是单元测试的业务。

2 个答案:

答案 0 :(得分:0)

我看到的方式是测试通​​常遵循“设置 - 操作 - 检查 - 拆卸”等模式。

我将大部分常见的设置和拆解集中在各自的功能中。

但是对于特定于测试的设置和拆解,它是测试方法的一部分。

我认为使用该对象的方法调用准备被测对象的状态没有错。在OOP中,我不会试图将状态与操作分离,因为范式需要很大程度地统一它们,如果可能的话甚至隐藏状态。在我看来,被测单元是类 - 状态和方法。

我通过将操作块和验证块与空行分开来对代码进行视觉区分。

答案 1 :(得分:0)

是的,我说这绝对没问题。

以任何方式测试实用。我发现在每个测试方法中测试完全一件事时,有太多的教条。这是一个可爱的理想,但有时候它的实际效果不如纯粹的替代品那么实用。