Ker*_*oll 7 c# unit-testing dependency-injection
我有一个业务层类,它使用System.IO.File从各种文件中读取信息.为了对这个类进行单元测试,我选择用一个注入的依赖项来替换对File类的依赖,如下所示:
using System.IO;
public interface IFileWrapper
{
bool FileExists( string pathToFile );
Stream Open( string pathToFile );
}
Run Code Online (Sandbox Code Playgroud)
现在我可以用模拟来测试我的课程,所有这些都适合世界.另外,我需要一个具体的实现.我有以下内容:
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 );
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的业务类不再依赖于System.IO.File类,可以使用Mock of IFileWrapper进行测试.我认为没有必要测试System.IO.File类,因为我认为这已经过Microsoft的全面测试,并在无数次使用中得到证明.
如何测试具体的FileWrapper类?虽然这是一个简单的类(低风险),但我有更大的例子遵循相同的方法.如果不完成此操作,我无法接近100%的代码覆盖率(假设这很重要).
我想这里更大的问题是,如何弥合单元测试和集成测试之间的差距?是否有必要测试此类,或者是否有一些属性来装饰此类以从代码覆盖率计算中排除此类.
根据经验,您应该对您编写的所有生产代码进行单元测试.但是,由于.NET的设计特性,总会有像上面的Adapter类这样的类无法正确进行单元测试.
我个人的经验法则是,如果你可以将适配器中的每个成员减少到1的圈复杂度,那么可以将它声明为Humble Object.
AFAIK没有办法从覆盖率报告中排除代码,但您可以在单独的程序集中实现您的Humble对象,这些程序集免于覆盖率报告.
归档时间: |
|
查看次数: |
565 次 |
最近记录: |