Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中使用Moq测试数据注释_C#_Entity Framework_Unit Testing_Moq - Fatal编程技术网

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

C# 在实体框架中使用Moq测试数据注释,c#,entity-framework,unit-testing,moq,C#,Entity Framework,Unit Testing,Moq,在测试Mock和Mock时,Moq是否正确地考虑了数据注释?例如,如果我试图执行代码优先实体模型的数据注释明确禁止的操作,是否会抛出正确的验证异常?如果没有,如何正确测试数据注释的预期结果 编辑:我应该注意,我使用的是Entity Framework 6,因为它经过了大修,可以更好地与模拟框架配合使用。Mock只提供了一个“伪造”的对象,它没有实现任何功能。它只是控制部分代码或防止空指针异常,因为某些实例根本没有设置。但是,所有没有在模拟对象中专门设置的方法都不会做任何事情 有一些关于如何对实体

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

编辑:我应该注意,我使用的是Entity Framework 6,因为它经过了大修,可以更好地与模拟框架配合使用。

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

有一些关于如何对实体框架进行单元测试的文章,也许这会有所帮助。
例如:

单元测试中普遍接受的智慧是“不要测试你不拥有的代码”,因此在这种情况下,即使
Moq
可以做到这一点(它不能做到,因为正如Ela所提到的,它只提供了接口某些部分的伪实现)您不应该-您必须接受由
System.ComponentModel
提供的
数据注释
(或任何一个)已经过作者的测试,并且按照广告的方式工作

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

另外,假设您有一个Mock
DbContext
EntitySet
,我甚至不知道数据注释是从哪里来的-它们只与实际实体的某些实现的单元测试相关,在这种情况下,您不应该靠近
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.
        }
    }
}

我不认为有任何其他可靠的方法来强制执行该要求,但我可能还是错了…

对,但我不是为了确保
数据注释
工作而进行测试,而是为了确保它们存在。如果有人意外地重构出一个
[必需]
属性,那么应该有一个测试失败了,你同意吗?@JHixson,抱歉-你的问题特别指出“如果我试图做一些代码优先实体模型的数据注释明确禁止的事情,是否会抛出正确的验证异常?”但可能我误解了:)无论如何——如果您想基本上“锁定”的话“您的实体上的特定字段必须具有
Required
属性,为什么不使用带有反射的单元测试呢?我很快会用一些代码更新我的答案。是的,我对模仿是如何工作的缺乏理解导致我的问题用词不正确。我没有意识到mock是空的,我希望如果
SaveChanges()
方法由于验证而在生产中失败,那么该方法也应该在测试中失败。我现在明白了,测试应该比这更具体,检查方法失败的一个具体原因。因此需要模拟。@JHixson,我明白你的意思,但是因为这些属性所做的验证是由实际的EF本身调用的,所以你需要进行大量模拟,因为你必须模拟DbContext更改跟踪机制,因为这样做的好处非常有限。我想说,这种测试最好留给集成测试阶段,在集成测试阶段,您将对真实数据库进行
SaveChanges()
-ing;或者创建一个覆盖
SaveChanges()
的“适当”存根
DbContext
,在其中,您可以手动调用验证并在需要时抛出。