当前位置:  开发笔记 > 数据库 > 正文

在单元测试中使用数据库

如何解决《在单元测试中使用数据库》经验,为你挑选了1个好方法。

我遇到了这个错误

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..  

试图编写一些单元测试来测试控制器.我觉得问题是测试试图不使用我在主项目中定义的数据库.所以我修改了测试中的连接字符串

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


    

然后通过执行覆盖DataDirectory

AppDomain domain = 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 Dinner示例,我从项目中的控制器中删除了对数据库的所有直接调用,并将它们移动到实现接口(IRepository)的存储库对象中.然后我创建了一个虚假的存储库对象,它也实现了IRepository.我为每个控制器添加了一个构造函数,允许传入一个IRepository来使用.然后更改默认控制器构造函数以初始化存储库.测试不再与数据库通信,因此它们更快,破坏性更小.



1> RossFabrican..:

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

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

有一些工具可以帮助您解决这个问题,例如将数据库查询的结果保存到配置文件中,这样您就可以使用实际数据设置测试,但它会快速加载并且永远不会更改,因为它现在已保存在与数据库分开的文件中.SnapDAL是您可以使用的一种工具.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有