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
Entity framework 在实体框架中,如何在不实际连接到数据库的情况下对dbmodel构造进行单元测试?_Entity Framework_Unit Testing_Ef Model Builder - Fatal编程技术网

Entity framework 在实体框架中,如何在不实际连接到数据库的情况下对dbmodel构造进行单元测试?

Entity framework 在实体框架中,如何在不实际连接到数据库的情况下对dbmodel构造进行单元测试?,entity-framework,unit-testing,ef-model-builder,Entity Framework,Unit Testing,Ef Model Builder,我有一个从DbContext继承的类,实现了代码优先实体框架对象 我希望有一个单元测试,在这个dbcontext中测试模型构建器——这对于检测“实体上未定义键”之类的错误非常有用 但在单元测试期间,我可能没有实际的数据库可用。有没有一种方法可以在不实际尝试与上下文建立数据库连接的情况下执行此代码。我尝试了一些无害的东西,比如: var ctx = new MyDbContext("Data Source=(local);Initial Catalog=Dummy;<.......>"

我有一个从DbContext继承的类,实现了代码优先实体框架对象

我希望有一个单元测试,在这个dbcontext中测试模型构建器——这对于检测“实体上未定义键”之类的错误非常有用

但在单元测试期间,我可能没有实际的数据库可用。有没有一种方法可以在不实际尝试与上下文建立数据库连接的情况下执行此代码。我尝试了一些无害的东西,比如:

var ctx = new MyDbContext("Data Source=(local);Initial Catalog=Dummy;<.......>");
var foo = ctx.GetValidationErrors();  //triggers DBModelBuilder, should throw if my DBModel is goofed up
var ctx=newmydbcontext(“数据源=(本地);初始目录=虚拟;”;
var foo=ctx.GetValidationErrors()//触发器DBModelBuilder,如果我的DBModel出错,应该抛出
这在技术上是可行的。但是,这需要很长时间才能运行——如果我暂停并检查调用堆栈,它将触发对System.Data.SqlClient.SqlInternalConnectionDS.AttemptOneLogin的调用

最终它超时了,吞下了连接错误并完成了我的测试


没有连接尝试,有什么方法可以做到这一点吗?

这里的解决方案就是解决这个问题,使用尽可能低的连接超时时间。我正在使用此连接字符串:

服务器=本地主机;数据库=tempdb;综合安全=真实;连接超时=1;ConnectRetryCount=0

它仍然会触发问题,但如果有一秒钟的超时,并且没有自动重试(仅针对系统中的这一个测试),则完全可以接受


如果开发人员安装了本地数据库,它会意外地工作得更快。

如果您使用实际的数据库,那么这不是单元测试,而是集成测试。我不确定您是否理解这个问题。整个要点是在不连接数据库的情况下验证DB模型代码。这当然不是一个集成测试。如果您有在没有虚拟连接尝试的情况下执行此测试的想法,那将非常棒!