2010-09-01 47 views
1

我感兴趣的是写一个类,它的公共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(); 
... 
} 

现在,我的问题是:它确定以使最后的测试方法AppendLine()的调用,即使我们正在测试的GETPAGES( ) 方法?

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

回答

0

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

我把大部分常用设置和拆卸集中在各自的功能中。

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

我没有看到使用该对象的方法调用来准备被测对象的状态。在面向对象程序设计中,我不会试图将操作状态与操作分离开来,因为范例花费了很大的努力来统一它们,并且如果可能的话甚至隐藏了状态。在我看来,被测单元是类 - 状态和方法。

我在代码中通过将操作块和验证块的设置块与空行分开来进行视觉区分。

+0

是的,看来如果我们严格应用“仅测试一种方法”规则,我们最终会得到一堆具有过程接口的类。 – Mohammad 2010-09-01 18:41:12

0

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

以任何方式测试实用。我发现测试正好在每种测试方法中都存在太多的教条。这是一个可爱的理想,但有时它只是稍微不那么纯粹的替代品。