【问题标题】:Testing Data Annotations using Moq in Entity Framework在实体框架中使用 Moq 测试数据注释
【发布时间】:2013-09-24 17:42:33
【问题描述】:

在测试 Mock<DbContext>Mock<DbSet<IEntity>> 时,Moq 是否正确考虑了数据注释?例如,如果我尝试做代码优先实体模型的数据注释明确禁止的事情,是否会引发正确的验证异常?如果没有,我如何正确测试数据注释的预期结果?

编辑:我应该注意我正在使用 Entity Framework 6,因为它已经过大修,可以更好地与 Mock Frameworks 配合使用。

【问题讨论】:

    标签: c# entity-framework unit-testing moq


    【解决方案1】:

    单元测试中普遍接受的智慧是“不要测试你不拥有的代码”,所以在这种情况下,即使Moq 可以做到这一点(它不能,因为正如 Ela 所说,它只是提供接口某些部分的虚假实现)你不应该 - 你必须接受System.ComponentModel(或任何一个)提供的DataAnnotations已经过他们的作者测试,并且像宣传的那样工作。

    当然,如果您已经编写了自己的自定义属性,那么您可以在单独的测试类中对该注释验证代码进行单元测试,该测试类独立于将其堆叠到属性上来测试其功能。

    另外,鉴于您有一个 Mock DbContextEntitySet,我什至看不到 DataAnnotations 的位置 - 它们只与实际实体的某些实现的单元测试相关 ,在这种情况下,您不应该靠近DbContextEntitySet - 您应该为手头的测试手动创建一个实体(或模拟一个实体)。随时告诉我们这些测试的背景是什么!

    更新: 为了对特定属性的特定属性的存在进行回归测试,您可以使用反射:

    public void MyEntityClass_PropertyFoo_HasRequiredAttribute()
    {
        var prop = typeof(MyEntity).GetProperties().FirstOrDefault(p=>p.Name=="Foo");
        if (prop!=null)
        {
            object[] attributes = prop.GetCustomAttributes(typeof(RequiredAttribute), true);
            if (attributes.Length==0)
            {
               //someone took it out, explode your test here.
            }
        }
    }
    

    我认为没有其他可靠的方法可以强制执行该要求,但我可能又错了......

    【讨论】:

    • 对,但我没有测试以确保DataAnnotations 工作,我正在测试以确保它们存在。如果有人意外重构了 [Required] 属性,那么应该有一个测试失败,你不同意吗?
    • @JHixson,抱歉-您的问题明确指出“如果我尝试执行代码优先实体模型的数据注释明确禁止的事情,是否会引发正确的验证异常”但也许我误解了它:) 无论如何-如果您想基本上“锁定”实体上的特定字段必须具有Required 属性,为什么不使用带有一些反射的单元测试呢?我很快会用一些代码更新我的答案。
    • 对,我对嘲弄的工作原理缺乏了解,导致我的问题措辞不正确。我没有意识到模拟是空的,并且希望如果 SaveChanges() 方法由于验证而在生产中失败,那么该方法也应该在测试中失败。我现在看到测试应该比这更具体,检查一个方法应该失败的一个具体原因。因此嘲笑。
    • @JHixson,我明白你的意思,但是因为这些属性完成的验证是由实际的 EF 本身调用的,所以你需要做很多模拟,因为你必须模拟DbContext 更改跟踪机制,恕我直言,好处非常有限。我想说这种测试最好留给集成测试阶段,在这个阶段你是SaveChanges()-ing 对一个真实的数据库;要么创建一个“正确的”存根 DbContext 覆盖 SaveChanges(),然后您可以在其中手动调用验证并在需要时抛出。
    【解决方案2】:

    Mock 只给你一个“伪造”的对象,它没有实现任何功能。它只是为了控制部分代码或防止空指针异常,因为根本没有设置某些实例。但是所有没有在模拟对象中专门设置的方法都不会做任何事情。

    有一些关于如何对实体框架进行单元测试的文章,也许这会有所帮助。 例如:http://msdn.microsoft.com/en-us/ff714955.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多