【问题标题】:Unit Test Entity Framework Data Annotations单元测试实体框架数据注释
【发布时间】:2014-08-10 09:57:51
【问题描述】:

目前,我编写了一个存储实体的存储库。 该实体是一个对象,并且继承自基类“Entity”。

public class Entity
{
    #region Constructors

    public Entity() : this(DateTime.Now, DateTime.Now) { }

    public Entity(DateTime creationDate, DateTime updateDate)
    {
        DateCreated = creationDate;
        DateUpdated = updateDate;
    }

    #endregion

    #region Properties

    [Key]
    [Required]
    [Column(Order= 0)]
    public int Id { get; private set; }

    [Required]
    [Column(Order = 998)]
    public DateTime DateCreated { get; private set; }

    [Required]
    [Column(Order = 999)]
    public DateTime DateUpdated { get; internal set; }

    #endregion
}

现在我想对包含实现实体的对象的存储库进行单元测试(而不是集成测试)。

我创建了一个假存储库,它使用 HashSet 将对象存储在内存中。 现在,问题是,当我将实体添加到我的存储库时,所有 Id 值都被分配为“0”,这是正常的。

在实体框架上,它们被分配了一个唯一的 int 值(从 0 开始),由于数据注释,这也是正常的。

现在我想知道在运行单元测试时如何模拟数据注释的相同行为,因为现在,我的存储库中可以有多个具有相同“键”值的记录,当然不应该在任何情况下都有可能。

谢谢。

【问题讨论】:

    标签: c# unit-testing


    【解决方案1】:

    您已经在使用构造函数链来为creationDateupdateDate 传递默认的DateTime 值——为什么不再添加一个?

    public class Entity
    {
        #region Constructors
    
        public Entity() : this(DateTime.Now, DateTime.Now, default(int)) { }
    
        public Entity(DateTime creationDate, DateTime updateDate, int id)
        {
            DateCreated = creationDate;
            DateUpdated = updateDate;
            Id = id
        }
    
        #endregion
    
        #region Properties
    
        [Key]
        [Required]
        [Column(Order= 0)]
        public int Id { get; private set; }
    
        [Required]
        [Column(Order = 998)]
        public DateTime DateCreated { get; private set; }
    
        [Required]
        [Column(Order = 999)]
        public DateTime DateUpdated { get; internal set; }
    
        #endregion
    }
    

    然后您可以根据需要为每个实体生成一个唯一 ID。

    【讨论】:

    • 老实说,我已经考虑过了。但我只是想检查是否有其他方法来测试它。或许这些属性中隐藏着某种魔力……
    • 这也是我不喜欢 EF、TBQH 的原因之一。它鼓励你用一堆 EF 属性弄脏你美丽、原始的 POCO。
    • @DanielMann 一个不用,因为有流利的api:msdn.microsoft.com/en-us/data/jj591617.aspx
    【解决方案2】:

    听起来您正在尝试测试错误的东西。你到底想完成什么? KeyAttribute 是您的存储层的实现细节,您不想对其进行测试 - 确保其正常工作是供应商的工作。

    假存储库是一种独立测试依赖于存储库接口的其他东西的方法。因此,您可能应该做的是创建一个测试用例,其中您的存储库被设置为抛出适合重复密​​钥场景的异常,然后验证您的被测系统在遇到该异常时是否正确。

    但是,您可能希望确保您的所有实体在其 Id 属性上都有 KeyAttribute。您可以将其作为单个单元测试来执行,该测试枚举您的实体类型并使用反射来验证属性的存在。

    【讨论】:

    • 我的存储库包含一组对象,并有一个我想测试的 GetById 方法。因此,所有实体都应该有不同的 id。
    • 帮助我理解:在什么情况下测试 fake 类的方法的实现是有意义的?
    • 你说得有道理。但我想实现几乎 100% 的代码覆盖率,因此需要进行测试。可能不需要,但我喜欢这些数字。而且我可能有一个实现存储库的类。所以要对它进行单元测试,我需要通过一个假的实现。这样更有意义吗?
    • 代码覆盖率是一个毫无意义的指标。它不能证明您的代码质量或存在的错误数量。测试正确的东西更重要。
    • 我知道,但我想我只是被这些数字迷住了。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    相关资源
    最近更新 更多