c# - 在.Net中 stub /模拟数据库

标签 c# database testing mocking

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

  • 我已将对数据库的所有调用提取到一个类中。这些方法只返回 DataSet 和 DataTable 对象。
  • 为每个方法执行一个示例调用,并将 DataSet/DataTable 序列化到磁盘。
  • 提取了一个公开所有可用方法的接口(interface)。
  • 实现了一个假数据库类,它只加载序列化数据并返回它。

  • 现在我已经序列化了可以在我的项目中 checkin 的示例结果,并且我可以在我的测试中使用假数据库。

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

    更新:

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

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

    关于如何构造代码有不同的选择,以使表的反序列化更容易。但这些是目前不需要讨论的实现细节。我的问题如下:

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

    最佳答案

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

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

    关于c# - 在.Net中 stub /模拟数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15359506/

    相关文章:

    mysql - 仅当不同列中的元素不匹配时才从列中返回元素的 SQL 语句

    python - 在本地测试 Hive + spark python 程序?

    javascript - 在 Supertest 上使用 PUT 方法

    testing - Window defender 想要重置您的设置”-ChromeDriver 2.29 问题 :ChromeBrowser opening with a new tab

    c# - Dapper SqlException 和 Unobserved 异常

    c# - 如何在没有 UrlHelper 的情况下创建 Url?

    c# - 查询太复杂。如何修改查询?

    sql - 是否可以在 sql 中使用字母数字序列生成器

    python - 找不到sqlite3数据库在哪里

    c# - 如何制作可点击的文本