c# - 我应该如何设置我的集成测试以将测试数据库与 Entity Framework 一起使用?

标签 c# asp.net-mvc entity-framework ef-code-first integration-testing

我正在为应用程序编写集成测试,但未能找到有关如何为我的集成套件设置测试数据库的任何最佳实践。我正在使用 Entity Framework 代码优先开发 ASP.NET MVC4 应用程序。

我可以确认我的测试项目中的测试默认与我机器上的本地开发数据库通信。这并不理想,因为我希望每次运行测试时都有一个新的数据库。

如何设置我的测试项目,以便我的测试与单独的实例对话?我假设可以设置 SQL Server Compact Edition 实例,但我不确定如何配置它。

最佳答案

非常感谢@Justin 和@Petro 的回答,这对我帮助很大。我提出的解决方案是您建议的技术的组合。下面描述的解决方案为每次运行的测试提供了一个新数据库,并为每个测试提供了一个单独的事务。

我在我的测试项目的 App.config 中为我的测试数据库添加了一个连接字符串:

  <connectionStrings>
    <add name ="TestDatabase"
     providerName="System.Data.SqlClient"
     connectionString="Data Source=(LocalDb)\v11.0;Database=TestDatabase;Integrated Security=True"/>
  </connectionStrings>

我为我的集成测试创建了一个基类,以提供设置和拆卸。安装程序实例化上下文,如果数据库不存在则创建数据库并启动事务。拆解回滚交易。

public class EntityFrameworkIntegrationTest
{
    protected MyDbContext DbContext;

    protected TransactionScope TransactionScope;

    [TestInitialize]
    public void TestSetup()
    {
        DbContext = new MyDbContext(TestInit.TestDatabaseName);
        DbContext.Database.CreateIfNotExists();
        TransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew);
    }

    [TestCleanup]
    public void TestCleanup()
    {
        TransactionScope.Dispose();
    }
}

最后,我有一个类负责在所有测试运行后删除数据库:

[TestClass]
public static class TestInit
{
    // Maps to connection string in App.config
    public const string TestDatabaseName = "TestDatabase";

    [AssemblyCleanup]
    public static void AssemblyCleanup()
    {
        Database.Delete(TestDatabaseName);
    }
}

我应该补充一点,我找到了 this blog post about Entity Framework对于更深入地了解 Entity Framework 在幕后/按照惯例在做什么很有用。

关于c# - 我应该如何设置我的集成测试以将测试数据库与 Entity Framework 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857180/

相关文章:

c# - 从本地存储读取数据时出现 NullReferenceException

c# - 如何在运行时读取给定项目中的 MSBuild 属性?

c# - 以编程方式批准/拒绝工作流程并添加评论

asp.net-mvc - Entity Framework 代码优先迁移 NOCHECK 约束?

C# - 接口(interface)不能包含运算符

asp.net-mvc - 值不能为 null 或为空。参数名称: contentPath

asp.net-mvc - MVC 3 中如何处理 session 超时

asp.net - Web配置转换为自定义部分

c# - 访问 select 中的透明标识符会引发它不是从范围引用的

c# - EF 更新两个实体未在数据库中更新