Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 使用流测试类_Unit Testing_Testing - Fatal编程技术网

Unit testing 使用流测试类

Unit testing 使用流测试类,unit-testing,testing,Unit Testing,Testing,我对为公共API涉及某种流的类编写单元测试的最佳方法感兴趣,例如: public class PaginatedWriter { public void AppendLine(string line) { ... } public IEnumerable<string> GetPages() { ... } public int LinesPerPage { get; private set; } } 现在,我的问题是:即使我们正在测试GetPages()方法,在最后一个测试方法中

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

public class PaginatedWriter {
public void AppendLine(string line) { ... }
public IEnumerable<string> GetPages() { ... }
public int LinesPerPage { get; private set; }
}
现在,我的问题是:即使我们正在测试GetPages()方法,在最后一个测试方法中调用AppendLine()是否可以


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

我认为测试通常遵循类似“设置-操作-检查-拆卸”的模式

我将大多数常见的设置和拆卸集中在各自的功能中

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

我认为使用对象的方法调用来准备被测试对象的状态没有错。在OOP中,我不会尝试将状态与操作分离,因为范例会竭尽全力统一它们,如果可能的话,甚至会隐藏状态。在我看来,被测试的单元是类状态和方法


我用一条空行将设置块、操作块和验证块分开,从而在代码中进行视觉区分。

是的,我认为这是绝对正确的


以任何你认为可行的方式进行测试。我发现在每种测试方法中只测试一件事情有太多的教条。这是一个很好的理想,但有时它远不如单纯的替代方案那么实用。

是的,如果我们严格应用“只测试一个方法”规则,我们最终会得到一堆具有过程接口的类。
public void AppendLine_EmptyLine_AddsEmptyLine() { ... }
public void AppendLine_NonemptyLine_AddsLine() { ... }
public void GetPages_ReturnsPages() {
 writer.AppendLine("abc");
 writer.AppendLine("def");
 var output = writer.GetPages();
 ...
}