n层架构的单元测试

时间:2012-05-17 08:19:19

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

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

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

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

业务层:

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();
}

1 个答案:

答案 0 :(得分:2)

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

  1. 您的业务层应该依赖于抽象(这在大多数情况下意味着接口)而不是具体的类。这样,在单元测试中,您可以为这些依赖项提供存根。
  2. 应该通过依赖注入(例如构造函数注入)提供业务层的依​​赖关系,这样在单元测试中,您可以轻松地传递它们的存根对象。
  3. 相同的原则应适用于Controller - 业务层交互。当你坚持这两条规则(基本上缩小为SOLID的依赖性反转原则)时,你的代码将比其他方法更加单元可测试(坚持SOLID原则是总体的好主意)。

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

    修改 - 如果代码是紧密耦合的,您的选项仅限于:

    • 重构(这很明显,但遗留系统可能不可能/值得付出努力)
    • 使用付费工具,例如TypeMock Isolator。 Isolator使用编译器API拦截方法调用,因此存根/模拟调用静态方法,私有成员以及免费框架不允许的所有内容。
    • 使用Microsoft Moles。 Moles利用动态组件生成生成假类型。这为您提供类似隔离器的灵活性,但是是免费的。请注意,它有点较重框架(额外的组合,文件等)。