我有一个业务层类,它使用 System.IO.File 从各种文件中读取信息。为了对此类进行单元测试,我选择用注入(inject)的依赖项替换对 File 类的依赖项,如下所示:
using System.IO;
public interface IFileWrapper
{
bool FileExists( string pathToFile );
Stream Open( string pathToFile );
}
现在我可以使用 Mock 测试我的类,一切正常。另外,我需要一个具体的实现。我有以下内容:
using System;
using System.IO;
public class FileWrapper : IFileWrapper
{
public bool FileExists( string pathToFile )
{
return File.Exists( pathToFile );
}
public Stream Open( string pathToFile )
{
return File.Open( pathToFile, FileMode.Open, FileAccess.Read, FileShare.Read );
}
}
现在我的业务类不再依赖于 System.IO.File 类,可以使用 IFileWrapper 的 Mock 进行测试。我认为没有必要测试 System.IO.File 类,因为我认为它已经过 Microsoft 的彻底测试并在无数次使用中得到证明。
如何测试具体的 FileWrapper 类?虽然这是一个简单的类(class)(低风险),但我有更大的示例遵循相同的方法。如果不完成此操作,我将无法接近 100% 的代码覆盖率(假设这很重要)。
我想这里更大的问题是,如何弥合单元测试和集成测试之间的差距?是否有必要测试这个类,或者是否有一些属性来修饰这个类以将其从代码覆盖率计算中排除。
最佳答案
根据经验,您应该对您编写的所有产品代码进行单元测试。但是,由于 .NET 设计的性质,总会有像您的 Adapter 这样的类。无法正确进行单元测试的类。
我个人的经验是,如果您可以将适配器中的每个成员减少到一个 cyclomatic complexity的 1 可以将其声明为 Humble Object .
据我所知,没有办法从覆盖率报告中排除代码,但您可以在独立的程序集中实现您的 Humble Objects,这些程序集不受覆盖率报告的影响。
关于c# - 我(或我)如何对具体的依赖项进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6808855/