gpt4 book ai didi

.net - 在单元测试中使用数据库

转载 作者:行者123 更新时间:2023-12-02 09:01:42 25 4
gpt4 key购买 nike

我遇到了这个错误

An attempt to attach an auto-named database for file C:\<...>\Out\MessagesDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share..  

尝试编写一些单元测试来测试 Controller 。我相信问题在于测试试图不使用我在主项目中定义的数据库。所以我将测试中的连接字符串修改为

在我正在使用的测试项目的 App.config 中

<connectionStrings>
<add name="MessagesDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MessagesDB.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>

然后通过执行以下操作覆盖 DataDirectory

AppDomain 域 = AppDomain.CurrentDomain;

        String currentDirectory = System.Environment.CurrentDirectory;
String DataDirectory = currentDirectory.Substring(0, currentDirectory.IndexOf("TestResults")) + "Server\\App_Data";
domain.SetData("DataDirectory", DataDirectory);
db = new Server.Models.MessagesDBDataContext();

效果很好,但看起来像黑客。我应该怎么做?

编辑:

今天我再次审视了这个可怕的困惑,并根据 Nerd Dining 示例,我删除了项目中 Controller 对数据库的所有直接调用,并将它们移至实现接口(interface) (IRepository) 的存储库对象中。然后我创建了一个假的存储库对象,它也实现了 IRepository。我向每个 Controller 添加了一个构造函数,允许传入要使用的 IRepository。然后更改默认 Controller 构造函数以初始化存储库。测试不再与数据库对话,因此速度更快且破坏性更小。

最佳答案

标准方法是模拟数据库。这意味着您正在测试的类采用一个提供数据的参数,并且看起来像一个数据库连接。

在单元测试中,您实际上传递了一个提供硬编码数据的实现。

有一些工具可以帮助您做到这一点,例如将数据库查询的结果保存到配置文件中,以便您可以使用真实数据设置测试,但它会快速加载并且永远不会改变,因为它现在保存在与数据库分开的文件中。 SnapDAL是您可以用于此目的的一种工具。

关于.net - 在单元测试中使用数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/684391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com