在.Net中对数据库进行存根/模拟

Ach*_*him 33 c# database testing mocking

我有一个webservice,它基本上只执行一些存储过程,转换数据并将其发送到浏览器.没有花哨的ORM映射器或类似的东西.为了能够在不访问数据库的情况下编写测试,我已完成以下操作:

  • 我已将对DB的所有调用提取到一个类中.这些方法只返回DataSet和DataTable对象.
  • 为每个方法执行了一个示例调用,并将DataSet/DataTable序列化到磁盘.
  • 提取了一个暴露所有可用方法的界面.
  • 实现了一个伪数据库类,它只加载序列化数据并返回它.

现在我已经序列化了样本结果,我可以用我的项目检查,我可以在我的测试中使用假数据库.

这对我很有用.是否有一些框架可以更轻松地创建和加载示例数据?我当前的项目很小,但我会在较大的项目中使用相同的模式.

更新:

显然所有答案都没有错,但忽略了这一点.我知道单元测试的基础知识.但是我的代码正在使用DataTables,所以我不得不以某种方式伪造我的DataTables.从头开始构建DataTable并不是一件容易的事,它会使我的测试膨胀并降低可读性.就我而言,手动生成有用的样本数据是不可能的.

因此,我对示例数据库执行了一些示例调用以获取一些DataTable.我已将这些表序列化到磁盘并使用序列化版本在测试时创建我的假DataTables.这样,测试独立于数据库.

关于如何构造代码有不同的选项,使表的反序列化更容易.但这些是实施细节,此时不需要讨论.我的问题如下:

管理示例调用和(反)序列化表是一项繁琐的工作.我正在寻找一些工具来使这更容易.

Ber*_*rmo 32

通过阅读其他答案和您所做的各种评论,您似乎想要一种更简单的方法来生成用于集成测试的大型填充数据集,而不会访问数据库.

NBuilder是一个很棒的开源库,我已经成功地创建了大量的测试数据.只需组合NBuilder,一些基本的POCO对象类和一些反射 - 您将拥有大量巨大的数据表,您可以很快将它们轻松地组合到数据集中:

public class Person
{
    public string First { get; set; }
    public string Last { get; set; }
    public DateTime Birthday { get; set; }
}

private DataTable GenerateDataTable<T>(int rows)
{
    var datatable = new DataTable(typeof(T).Name);
    typeof(T).GetProperties().ToList().ForEach(
        x => datatable.Columns.Add(x.Name));
    Builder<T>.CreateListOfSize(rows).Build()
        .ToList().ForEach(
            x => datatable.LoadDataRow(x.GetType().GetProperties().Select(
                y => y.GetValue(x, null)).ToArray(), true));
    return datatable;
}

var dataset = new DataSet();
dataset.Tables.AddRange(new[]{
        GenerateDataTable<Person>(50),
        GenerateDataTable<Dog>(100)});
Run Code Online (Sandbox Code Playgroud)


stu*_*rtf 6

要对转换进行单元测试,您根本不需要模拟数据库.我怀疑你已经将转换与数据库调用紧密耦合在一起.你想要做的是将你所有的转换逻辑提取到它自己的类中,如下所示:

public static Transformations
{
    public static DataSet TransformationA(DataSet dataSet)
    {
        //transformation logic here
    }

    public static DataSet TransformationB(DataSet dataSet)
    {
        //transformation logic here
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以通过传入数据集来单元测试转换逻辑,然后断言返回的数据集应用了正确的转换.这将阻止您必须实现另一个数据存储(您的'假'数据库)仅用于测试目的.

希望这会有所帮助