unit-testing - 使用流测试类

标签 unit-testing testing

我对为公共(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/

相关文章:

javascript - 如何使用 mocha 使用 'done();' 进行异步测试?

Android 单元测试 Robolectric :3. 3.2 - 没有这样的 list 文件 : build\intermediates\manifests\full\debug\src\main\AndroidManifest. xml

unit-testing - VS-Code 错误的单元测试类型(Mocha&Chai 而不是 Jasmine)

java - 如何模拟构造函数中设置的属性

java - 在 Robolectric 测试中注入(inject)模拟

scala - 使用 Scala 进行 Akka actors 单元测试

java - 如何在 Java 中记录未捕获的异常?

java - 如何断言某个字符串至少包含列表 <String> 中的一个值?

ios - 拥有 "generic"配置文件是不好的做法还是坏主意?

c# - 在测试中使用已实现的方法是好主意还是坏主意?