Mock<DbContext>
Moq 在测试 a和时是否正确考虑了数据注释Mock<DbSet<IEntity>>
?例如,如果我尝试做代码优先实体模型的数据注释明确禁止的事情,是否会引发正确的验证异常?如果没有,我如何正确测试数据注释的预期结果?
编辑:我应该注意我使用的是 Entity Framework 6,因为它已经过大修,可以更好地与 Mock Frameworks 一起工作。
Mock<DbContext>
Moq 在测试 a和时是否正确考虑了数据注释Mock<DbSet<IEntity>>
?例如,如果我尝试做代码优先实体模型的数据注释明确禁止的事情,是否会引发正确的验证异常?如果没有,我如何正确测试数据注释的预期结果?
编辑:我应该注意我使用的是 Entity Framework 6,因为它已经过大修,可以更好地与 Mock Frameworks 一起工作。
单元测试中普遍接受的智慧是“不要测试你不拥有的代码”,所以在这种情况下,即使Moq
可以这样做(它不能因为正如 Ela 所提到的,它只是提供某些部分的虚假实现接口的)你不应该 - 你必须接受DataAnnotations
由System.ComponentModel
(或任何人)提供的已经由他们的作者测试,并按照宣传的那样工作。
当然,如果您已经编写了自己的自定义属性,那么您可以在单独的测试类中对该注释验证代码进行单元测试,该测试类独立于将其堆叠到属性上来测试其功能。
另外,鉴于您有一个 Mock DbContext
and EntitySet
,我什至看不到 DataAnnotations 进入它的位置-它们仅在单元测试中与实际实体的某些实现相关,在这种情况下,您不应该靠近 aDbContext
或者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.
}
}
}
我认为没有其他可靠的方法可以强制执行该要求,但是我很可能又错了……
Mock 只给你一个“伪造”的对象,它没有实现任何功能。它只是为了控制部分代码或防止空指针异常,因为根本没有设置某些实例。但是所有未在模拟对象中专门设置的方法都不会做任何事情。
有一些关于如何对实体框架进行单元测试的文章,也许这会有所帮助。例如:http: //msdn.microsoft.com/en-us/ff714955.aspx