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