【发布时间】:2017-07-20 00:00:39
【问题描述】:
我正在尝试向我的 MVC 应用程序添加单元测试。具体来说,我目前正在尝试测试 Web API 控制器的各个部分。
当我的测试方法尝试实际加载控制器时,我收到一个错误,表明我没有定义所需的数据库连接字符串。
即使在我的主项目中定义了连接字符串,我知道我需要将它们添加到我的测试项目的 app.config 中,我这样做了。但后来我得到了一个新的错误。
VegaModel.ssdl(2,2):错误 0152:没有为具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序找到实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。
我没有收到此错误,但建议的修复似乎很简单,我将 web.config 中的 <entityFramework> 部分复制到我的测试项目的 app.config em>。
现在我得到了这个错误:
无法识别的配置部分 entityFramework。 (C:\Users\Jonathan\Documents\Viper\Branches\Vega\Vega.Tests\bin\Debug\Vega.Tests.dll.config 第 38 行)
好吧,最后两个错误似乎相互矛盾。但更重要的是,我的主程序使用实体框架,但我的测试项目没有(无论如何)。所以我对这条似乎导致在我的测试项目中配置越来越多的实体框架的路径感到困扰。
从单元测试项目中加载使用实体框架的控制器的最简单方法是什么?
【问题讨论】:
-
您的实体框架部分从副本中无效,为什么要手动执行,为什么不在单元测试项目中使用nuget安装正确版本的EF,并让它添加配置
-
听起来你需要研究模拟
-
@johnny5:我想我没有完全理解为什么在我的测试项目中需要实体框架。但我想在这种情况下主应用程序没有运行,而是我只是在我的测试应用程序中加载一个类。所以,我想我会试试你的建议。但这让我想知道我还需要安装什么。我的主应用中安装的所有内容?
-
@JonathanWood 理想情况下,您应该模拟单元测试的上下文访问,否则您实际上是在进行集成测试。如果您已经实现了存储库模式,您应该能够抽象逻辑。
-
@我只是在使用
dbContext,这是它自己项目的一部分。我从我的测试项目中引用该项目。这对我来说似乎是最好的方式。但是该应用程序使用了其他东西。有执行身份验证的消息过滤器。我要么必须引入所有这些东西,要么很容易创建一个单独的应用程序来调用 API 并以这种方式对其进行测试。
标签: c# .net asp.net-mvc entity-framework unit-testing