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

本文关键字:运行 单元测试 MVC5 Net DbContext ASP 使用 | 更新日期: 2023-09-27 18:36:33

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

所以我尝试打开 2 个 Visual Studio 实例,但它仍然不起作用。

这是我的代码:

    private ApplicationDbContext db = new ApplicationDbContext();
    [TestMethod]
    public void IsDbNull()
    { 
        var dblist = db.StudentInformation.ToList(); 
        Assert.IsNotNull(dblist);
    }

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

看到一些代码通过将其作为CSV来使用假数据库,但是我不想使用这种方法,因为我想测试真实数据本身。

我还在GitHub上看到了"运行测试",但它只支持VS 2012

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

撇开关于单元测试构成的讨论,正如@jdphenix在评论中所建议的那样,你的问题很可能是一个配置问题。 这方面的主要证据来自您的陈述:

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

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

回应您的评论:

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

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

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

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

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

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

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

由于你似乎正在使用 MS 测试框架,因此需要可用于测试的任何配置都应放置在项目中的 App.config 文件中(如果使用 nuget 引用实体框架,则可能已添加该文件)以使其可用(请注意,这因不同的测试框架而异,如果使用非标准测试运行程序,也可能有所不同)。