使用DbContext在ASP.Net MVC5上运行单元测试

时间:2016-02-28 17:46:00

标签: c# asp.net entity-framework unit-testing

我目前在我的项目中使用单元测试,但似乎我在我的网站DBContext上获取数据时遇到了麻烦,我认为我需要运行web项目然后运行测试,但我不认为Visual Studio允许这样做。

所以我尝试打开2个Visual Studio实例,但它仍然无效。

这是我的代码:

$scope.category = {"product":$scope.addedProduct, "nameCat":null};

一个简单的断言来检查项目是否可以读取我的数据库,我尝试了debuging并且dblist上没有任何项目。

我看到一些使用虚假数据库的代码将其设为CSV,但我不想去那种方法,因为我想测试真实数据本身。

我也看过"运行测试"在GitHub上但它只支持VS 2012

1 个答案:

答案 0 :(得分:1)

如@jdphenix在评论中所建议的那样,不考虑构成单元测试的内容,您的问题很可能是配置问题。这方面的主要证据来自你的陈述:

  

我尝试了debuging,dblist上没有任何项目。

如果您的测试代码无法连接到 数据库,则在尝试从中读取内容而不是空列表时会出现异常,这就是您要报告的内容。

回应你的评论:

  

如果我在测试项目中进行配置,那么我将需要复制数据库,这是无意义的,因为它是一个单元测试。它的目的只是测试主项目没有自己的配置

使用实体框架时,如果您没有为其提供配置信息,它将根据您用于连接数据库的上下文的名称空间和类名派生连接字符串(我相信它也会假设您希望使用SQLEXPRESS作为提供程序,尽管这可能取决于版本)。如果您不在单元测试项目中提供配置信息,那么这就是实体框架将要执行的操作。如果您的应用程序中没有任何配置,那么两者将匹配,并且所有内容都将指向同一个数据库。

但是,在大多数实际应用程序中,您的应用程序中会包含某种连接信息。这可能是因为您需要合理的数据库名称,或者您需要能够控制数据库所在的计算机,或者您需要使用其他提供程序。如果是这种情况,则需要将连接字符串复制到测试项目中。注意,复制连接字符串不会“复制数据库”,它只是创建另一个指向数据库的指针。

值得注意的是,如果测试项目中存在不匹配,EF将尝试使用默认值创建一个新数据库(如果尚不存在)。

检查是否是配置问题的一种简单方法是调试测试和实际代码并比较以下值:

(((System.Data.Entity.DbContext)(db)).Database.Connection).ConnectionString

其中db是数据库上下文的实例化名称(请注意,在填充之前,您必须执行db.StudentInformation.ToList()之类的行。

当您似乎使用MS测试框架时,您需要可用于测试的任何配置都应放在项目中的App.config文件中(如果您使用nuget引用实体,则可能已添加该文件)框架)使其可用(注意,这随着不同的测试框架而变化,如果您使用的是非标准的测试运行器,也可能会有所不同。)