1

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

编辑:我应该注意我使用的是 Entity Framework 6,因为它已经过大修,可以更好地与 Mock Frameworks 一起工作。

4

2 回答 2

2

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

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

另外,鉴于您有一个 Mock DbContextand 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.
        }
    }
}

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

于 2013-09-24T20:31:35.193 回答
0

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

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

于 2013-09-24T17:49:01.910 回答