在测试Mock<DbContext>
和Mock<DbSet<IEntity>>
时,Moq是否正确考虑了数据注释?例如,如果我尝试执行代码优先实体模型的数据注释明确禁止的事情,是否会抛出适当的验证异常?如果没有,我如何从数据注释中正确测试我的预期结果?
编辑:我应该注意到我正在使用Entity Framework 6,因为它已经过大修,可以更好地使用Mock Frameworks。
答案 0 :(得分:1)
单元测试中普遍接受的智慧是“不要测试你不拥有的代码”,所以在这种情况下,即使Moq
可以做到这一点(并且它不能因为Ela提到的,它只是提供了界面某些部分的虚假实现)你不应该 - 你必须接受DataAnnotations
提供的System.ComponentModel
(或其中任何一个)已被其作者测试过,并按宣传的方式工作
当然,如果您已经编写了自己的自定义属性,那么您可以在一个单独的测试类中对此注释验证代码进行单元测试,该测试类测试其功能,而不依赖于它被堆叠到属性上。
另外,假设你有一个模拟DbContext
和EntitySet
,我甚至看不到DataAnnotations进入它的位置 - 它们只与某个实现的单元测试相关实际实体,在这种情况下,您不应该在DbContext
或EntitySet
附近 - 您应该为手头的测试手动创建一个实体(或模拟一个实体)。请随时告诉我们这些测试的背景是什么!
更新: 要对特定属性上存在特定属性进行回归测试,可以使用反射:
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