我对为公共(public) 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() 操纵内部状态,我认为这不应该是单元测试的业务。
最佳答案
我的看法是,测试通常遵循“设置 - 操作 - 检查 - 拆卸”这样的模式。
我将大部分常见的设置和拆卸集中在各自的功能中。
但对于测试特定的设置和拆卸,它是测试方法的一部分。
我认为使用该对象的方法调用来准备被测对象的状态没有任何问题。在 OOP 中,我不会尝试将状态与操作分离,因为范式竭尽全力统一它们,如果可能甚至隐藏状态。在我看来,被测单元是类——状态和方法。
我确实通过用空行将设置 block 与操作 block 和验证 block 分开来在代码中进行视觉区分。
关于unit-testing - 使用流测试类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3620510/