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

时间:2013-09-24 17:42:33

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

另外,假设你有一个模拟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.
        }
    }
}

我认为没有任何其他可靠的方法来强制执行该要求,但我可能再次错了......

答案 1 :(得分:0)

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

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