C# 使用数据库中的真实数据为单元测试创建编码数据对象

C# 使用数据库中的真实数据为单元测试创建编码数据对象,c#,unit-testing,domain-driven-design,C#,Unit Testing,Domain Driven Design,我将为我的方法编写一些单元测试: using System.Linq; ... public int CountEnabledEvents(IEnumerable<Event> events) { return events.Count(e => e.IsEnabled); } 所以我准备在我的测试类上创建一些虚拟事件: var event1 = new Event() { Id = new Guid("..."), IsEnabled = true

我将为我的方法编写一些单元测试:

using System.Linq;
...
public int CountEnabledEvents(IEnumerable<Event> events) 
{
    return events.Count(e => e.IsEnabled);
}
所以我准备在我的测试类上创建一些虚拟事件:

var event1 = new Event() {
    Id = new Guid("..."),
    IsEnabled = true
}
var event2 = new Event() {
    Id = new Guid("xxx"),
    IsEnabled = false
}
问题是A)这非常乏味,B)我的数据库中实际上有大量真实事件,我想在单元测试中使用真实事件,因为使用真实数据进行测试将使我们的测试更加准确

是否有任何类型的软件或方法可以用数据库中的真实数据自动创建这些虚拟
事件
对象?

谢谢你抽出时间

编辑

我认为很明显,我提供的代码是对实际代码的简化。我想要进行单元测试的实际方法更复杂,实际的
事件也更复杂


是的,写下真实事件对象的N^N个可能性是相当乏味的。不,我不想测试与数据库的集成或诸如此类的东西。我试图用数据库中的数据创建在实际测试中编码的静态实例。不是在测试运行时,而是更早。我认为您走错了路。也许您误解了单元测试的含义

  • 单元测试只是为了验证代码在更改后仍然具有相同的行为

出于您的目的,您需要搜索集成测试。如果您希望将其与实体框架6一起使用。也许你应该看看这一点:(注意他们也混合了单元测试和集成测试)

我真的不明白什么是乏味的,或者为什么使用真实数据会使测试更准确。您只查看了
IsEnabled
属性。一些硬编码的事件可以做到这一点,但如果您只想生成随机事件,单元测试设置将跟踪生成了多少
IsEnabled=true
,并将其与调用
CountEnabledEvents(randomizedEvents)
的结果进行比较


我展示的代码只是实际代码的简化,其中 有很多可能的组合

如果您希望将真实数据作为静态单元测试样本,我会想到两件事:

  • 创建一个C#程序,从DB读取事件,并生成C#代码来实例化这些事件,然后将其复制到单元测试设置中

  • 您可能已经有了序列化/反序列化事件的机制(例如从/到JSON)。您可以从数据库中读取序列化形式的事件,并将其复制到单元测试设置中,这也将在运行时反序列化事件


  • 可能有两种方法可以实现这一点:

    您似乎在关注基于状态的单元测试,但测试数据广泛地表示在数据存储中。您可以使用该数据存储生成相关的“数据集”,然后使用它在c#中生成一些状态(对象)

    另一种选择可能是将作为相关数据集的测试数据存储区中的数据隔离起来,然后让一些工厂/存储库/DAO直接从数据存储区生成所需的对象。数据集可以被提取到一个小得多的数据库中,保存在可以访问的地方,或者甚至可以被提取成其他格式(xml、json)并从中检索

    我注意到,任何映射软件都会从数据库中生成数据,但我认为自己编写一些东西可能不会太费力,因为这可能是您所指的一个相当特定的数据位

    我真的不认为从数据库获取测试数据进行基于状态的测试有什么错;特别是如果它涵盖了相当多的可能性

    您可以创建一个属性,该属性注入测试值,但通过接口的一些实现检索它们。沿着这条路线。它将比
    TestCase
    属性稍微复杂一些,并且可能是知道如何检索数据的特定属性

    更新


    我刚刚读了p | a | x提供的答案,我们似乎在思考同样的问题:)

    我展示的代码只是对实际代码的简化,其中有很多可能的组合。random不是一个选项,因为有些属性是字符串,但有一组可能的字符串,以及该字符串与其他属性的可能组合,所以这就是为什么我要问如何从实际的数据库数据中自动硬编码。是的,我要选择选项1。这就是为什么我来这里问是否有人面临这种情况并创建了某种应用程序来实现这一点。@r1verside我对此表示怀疑。这是一个非常具体的用例。不过,使用选项2可能会更好,因为您必须在系统中已有这些机制来存储和检索事件。只需对事件的数据存储形式进行硬编码,然后在运行时使用反序列化程序。这应该很容易实现。好吧,看来你是对的,没有任何工具可以帮助我实现我的目标。谢谢。我在问题中使用的代码是一个过度简化的检查,用于创建虚假数据。一切都在记忆中。不是数据库连接工具。谢谢@Nkosi我已经去过了,问题是我在寻找真实数据的时候伪造了虚假数据。请选民解释他们的原因好吗?恐怕我没有。我所问的与集成测试无关。顺便说一句,你的书放在我桌上了吗我还没来得及检查。虽然已经阅读了蓝色和红色书籍,并计划尽快阅读Greg的版本。好的,谢谢你们,我给了你们代表奖金,因为我认为这比@plalx更具解释性,但我给了h
    var event1 = new Event() {
        Id = new Guid("..."),
        IsEnabled = true
    }
    var event2 = new Event() {
        Id = new Guid("xxx"),
        IsEnabled = false
    }