【问题标题】:Unit Test for n tier architecturen 层架构的单元测试
【发布时间】:2012-05-24 19:36:45
【问题描述】:

我正在使用 3 层架构:控制器、业务和数据层。在我的数据层中,我通过传递连接字符串和其他必要参数来调用 Sql Server 数据库。

我必须为控制器层和业务层编写单元测试。我想编写一个存根(假存储库),从中返回硬编码的值/结果。当我为业务层编写测试时,逻辑应该调用这个存根而不是真正的数据库。

如何在业务层编写代码来实现这一点?

业务层:

public string GetValues(string xmlData)
{
    DataObject do = new DataObject ();
    string result = do.GetValues(xmlData);
    return result;
}

数据访问:

public static string GetValues(string xmlData)
{
    return SqlHelper.ExecuteScalar(
        ConfigurationManager.AppSettings["ConnectionString"].ToString(),     
        "DBO.usp_GetDetail",
        xmlData
    ).ToString();
}

【问题讨论】:

    标签: c# visual-studio unit-testing stub


    【解决方案1】:

    为了测试您的场景,您的代码必须是可测试的。如果它遵循SOLID 原则,它很可能是。但让我们专注于进行这种单元测试的必要条件:

    1. 您的业务层应该依赖于抽象(这在大多数情况下意味着接口)而不是具体的类。这样,在单元测试中,您可以为这些依赖项提供存根。
    2. 业务层的依​​赖项应通过依赖项注入(例如构造函数注入)提供,以便在单元测试中轻松传递存根对象。

    同样的原则应该适用于控制器 - 业务层交互。当您坚持这两条规则(本质上仅限于 SOLID 的依赖倒置原则)时,您的代码将比其他方式更易于单元测试(坚持 SOLID 原则总体上是个好主意)。

    由于您最终可能会编写模拟/存根,因此我建议使用现有的模拟框架,例如 MoqFakeItEasy

    编辑 - 如果代码如此紧密耦合,您的选择仅限于:

    • 重构(这很明显,但使用遗留系统可能不可能/值得努力)
    • 使用付费工具,例如 TypeMock Isolator。 Isolator 使用编译器 API 来拦截方法调用,因此可以stub/mock调用静态方法、私有成员以及免费框架不允许的所有内容。
    • 使用Microsoft Moles。鼹鼠利用动态装配生成生成假类型。这为您提供了类似 Isolator 的灵活性,但它是免费的。请注意,它有点更重 框架(额外的程序集、文件等)。

    【讨论】:

    • 感谢 Jimmy,现有代码的问题是,它是紧密耦合的。编码是使用具体类而不是接口完成的。
    • @palakmehta:我明白了。这使测试变得复杂,但并非不可能。您可能需要使用不同的工具。查看我的编辑。
    • @k.m 所以在复古,你最终做了什么?您最终是使用 TypeMock 之类的工具还是使用 Sprout 方法重构代码库?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多