我认为您不应该浪费时间测试不是您的代码的东西。这是一个设计选择,而不是测试选择,是处理底层框架的错误还是让它们传播到调用者。FWIW,我认为您让它们传播是正确的。但是,一旦您做出了设计决定,您的单元测试应该覆盖您的代码(并且很好地覆盖它),而不需要测试底层框架。使用依赖注入和模拟 Stream 可能也是一个好主意。
[编辑] 依赖注入示例(有关更多信息,请参见上面的链接)
不使用依赖注入我们有:
public class CvsReader {
private string filename;
public CvsReader(string filename)
{
this.filename = filename;
}
public string Read()
{
StreamReader reader = new StreamReader( this.filename );
string contents = reader.ReadToEnd();
.... do some stuff with contents...
return contents;
}
}
使用依赖注入(构造函数注入),我们可以:
public class CvsReader {
private IStream stream;
public CvsReader( IStream stream )
{
this.stream = stream;
}
public string Read()
{
StreamReader reader = new StreamReader( this.stream );
string contents = reader.ReadToEnd();
... do some stuff with contents ...
return contents;
}
}
这使得 CvsReader 更容易测试。我们在构造函数中传递了一个实现我们依赖的接口的实例,在本例中为 IStream。因此,我们可以创建另一个实现 IStream 的类(可能是模拟类),但不一定执行文件 I/O。我们可以使用这个类向我们的读者提供我们想要的任何数据,而无需涉及任何底层框架。在这种情况下,我会使用 MemoryStream,因为我们只是从中读取。不过,在我们想要的情况下,我们可以使用一个模拟类并给它一个更丰富的接口,让我们的测试配置它给出的响应。这样我们就可以测试我们编写的代码,而完全不涉及底层框架代码。或者,我们也可以传递一个 TextReader,但正常的依赖注入模式使用接口,我想用接口展示模式。可以说传入 TextReader 会更好,因为上面的代码仍然依赖于 StreamReader 实现。