我应该如何设置集成测试以将测试数据库与实体框架结合使用?

2024-03-19

我正在为应用程序编写集成测试,但无法找到有关如何为我的集成套件设置测试数据库的任何最佳实践。我正在使用实体框架代码优先开发 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);
    }
}

我应该补充一点,我发现这篇关于实体框架的博文 http://blogs.msdn.com/b/adonet/archive/2010/09/02/ef-feature-ctp4-dbcontext-and-databases.aspx对于更深入地了解实体框架在幕后/按照惯例正在做什么很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何设置集成测试以将测试数据库与实体框架结合使用? 的相关文章

随机推荐

  • Spring Security - 即使凭据正确,身份验证也不起作用

    我在我的应用程序中使用 spring security 拦截一些 URL 进行身份验证 虽然网址 securemapping1 通过显示登录页面提示用户登录 但是登录不起作用 即使我提供了正确的凭据 我也会返回登录页面 凭据错误 错误通过调
  • AngularJS 应用程序在 IE 中加载缓慢 - 添加进度条

    UPDATE1 开始使用ngProgress http victorbjelkholm github io ngProgress 但在 IE 中没有给出所需的效果 最终更新 找到最佳解决方案 请参阅下面的最后一个答案 AngularJS 应
  • TreeSet 自定义比较器算法 .. 字符串比较

    从提供的输入字符串 200 400 7 1 100 0 1 1 200 200 3 1 0 400 11 1 407 308 5 1 100 600 9 1 我在 TreeSet 中添加相同的内容 并希望它按第三个元素顺序排序 因此预期输出
  • Mac Excel 2016 VBA - Workbook.open 出现 1004 错误

    我正在尝试让一个在 Excel 2011 for Mac 中完美运行的宏在 Excel 2016 for mac 中运行 目标是让用户指定一个包含 csv 文件的文件夹 然后宏循环遍历所有 csv 文件 打开每个文件将信息从其中复制到另一个
  • 钩子回调时状态不正确

    我正在使用 socket io 和 React hooks 编写一个聊天客户端 消息历史记录 chatMessages 时addMessage 收到消息事件后 调用不正确 始终为空数组 chatMessages确实更新 正确 但在下次调用时
  • 在 VBA (Microsoft Access) 中将标签的“Caption”属性的一部分加粗

    如何将 Microsoft Access 标签标题中的某个单词加粗 如果有帮助 文本本身将存储在 Microsoft Access 表中 下面是一个例子 我有一个带有标签的 Microsoft Access 表单 位于Form Load 事
  • 缓慢选择所有条目

    下面的 SELECT 与内部表一起运行GIT KUNNR TAB包含 2 291 000 条具有唯一客户 kunnr 的行 需要 16 分钟才能完成 select kunnr umsks umskz gjahr belnr buzei bs
  • 有没有办法知道文档何时已从缓存与数据库同步?

    我正在构建一个即时通讯应用程序 类似于WhatsApp 我需要显示消息的发送状态 正在发送 已发送 如果是 Firebase 缓存 由于处于离线状态 则发送 如果消息位于在线数据库上 则发送 有没有办法判断特定文档是否已上传到数据库 我目前
  • androidplot背景图像移位

    我尝试使用以下代码将图形网格的背景分为 3 个区域 int data 0xff000000 0x80008000 0xff000000 bgBitmap Bitmap createBitmap data 1 3 Bitmap Config
  • 如何在facebook SDK中分享视频?

    我编写了如下代码 其中文件存在于资源中 它不为空 我成功添加图像 但卡在视频上 void uploadVideo NSLog UPload Videio NSString filePath NSBundle mainBundle pathF
  • 数据库中的实体类...错误无效资源_pm

    我通过 phpMyAdmin 在 MySQL 中创建了数据库和表 我正在尝试使用数据库中的实体类将其连接到我的项目 但是 当我运行我的项目时 出现以下错误 Caused by com sun appserv connectors inter
  • Windows 7、R 3.0.2、插入符号 6.0-21 上插入符号中的 train() 出现致命错误

    我正在尝试使用train 插入符号以适应分类模型 但我遇到了某种未处理的异常 并且在 R 控制台中输出任何错误信息之前我的 R 会话崩溃了 Windows 错误 R for Windows 终端前端已停止工作 我正在运行 Windows 7
  • html表格中的MVC分页

    我有一个带有搜索按钮的搜索表单 当用户输入所有搜索输入字段并按下搜索按钮时 将仅返回同一页面中 html 表中的前 10 条记录 我已经做到了这一点 当用户按下下一页按钮时 我必须保留用户输入的值并将其发送到数据库并获取接下来的 10 条记
  • 在 Z3 中证明归纳事实

    我试图在 Microsoft 的 SMT 求解器 Z3 中证明一个归纳事实 我知道 Z3 一般不提供此功能 如Z3 guide http rise4fun com z3 tutorial guide 第 8 节 数据类型 但是当我们限制要证
  • 未捕获的语法错误:意外的标记:

    我正在 MooTools 脚本中运行 AJAX 调用 这在 Firefox 中工作正常 但在 Chrome 中我得到了Uncaught SyntaxError Unexpected token 错误 我无法确定原因 注释掉代码以确定错误代码
  • 传递多个参数来应用 (Python)

    我正在尝试清理 Python 中的一些代码以向量化一组功能 我想知道是否有一种好方法使用 apply 来传递多个参数 考虑以下内容 当前版本 def function 1 x if string in x return 1 else ret
  • Firebase事务api调用当前数据为空

    当我使用transaction 更新一个位置 该位置的数据是返回空值即使该位置有一些数据 I tried transaction 读取数据后在同一位置 它提供该位置的所有数据 我该如何使用transaction 如果情况像上面那样呢 事务以
  • PHP set_time_limit 抛出 500 错误?

    当我使用set time limit如果脚本运行时间超过 360 秒 则会抛出 500 错误 359 没什么 360及以上 错误 我无法访问 php ini 如何修复此错误 脚本运行时间超过 360 秒 就会抛出 500 错误 听起来你在某
  • Kafka消费者启动延迟汇合dotnet

    当启动 confluence dotnet Consumer 时 在调用订阅和后续轮询之后 似乎需要很长时间才能从服务器接收 分区已分配 事件 因此也需要很长时间 大约 10 15 秒 起初我以为存在自动创建主题的开销 但无论消费者的主题
  • 我应该如何设置集成测试以将测试数据库与实体框架结合使用?

    我正在为应用程序编写集成测试 但无法找到有关如何为我的集成套件设置测试数据库的任何最佳实践 我正在使用实体框架代码优先开发 ASP NET MVC4 应用程序 我可以确认我的测试项目中的测试默认与我的计算机上的本地开发数据库进行通信 这并不