c# - 我(或我)如何对具体的依赖项进行单元测试

标签 c# unit-testing dependency-injection

我有一个业务层类,它使用 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/

相关文章:

python - 在 python 中使用 Mocking 进行单元测试

c# - Azure Function(使用 DI)无法删除 "/api"路由前缀

c# - 如何调试通过协议(protocol)关联启动的Windows Phone 8.1 应用程序?

c# - WPF 工具提示触发器不工作

c# - WPF 依赖属性不起作用

java - 正确定义 jUnit 测试用例

python - Python 的 id() 有多独特?

java - 注入(inject)对象时 @inject 似乎不起作用 NPE

c# - 如果我们想利用依赖注入(inject),我们还应该创建实例吗?

c# htmlagilitypack 在嵌套元素中选择第一个标签