繁体   English   中英

在实体框架中使用Moq测试数据注释

[英]Testing Data Annotations using Moq in Entity Framework

Moq在测试Mock<DbContext>Mock<DbSet<IEntity>>是否正确考虑了数据注释? 例如,如果我尝试执行代码优先实体模型的数据注释明确禁止的操作,是否会抛出适当的验证异常? 如果没有,如何正确测试数据注释的预期结果?

编辑:我应该注意,我使用的是Entity Framework 6,因为它已经过全面改进,可以更好地与Mock Frameworks协同工作。

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

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

另外,假设您具有Mock DbContextEntitySet ,我什至看不到DataAnnotations进入的位置-它们仅在单元测试中与实际实体的某些实现相关,在这种情况下,您不应该在任何地方在DbContextEntitySet附近-您应该手动为即将进行的测试创建一个实体(或DbContext一个实体)。 随时让我们知道这些测试的内容是什么!

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

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.
        }
    }
}

我认为没有其他可靠的方法可以执行该要求,但是我可能还是错了。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM