无法在Effort框架的单元测试中使用现有数据库
本文关键字:数据库 单元测试 Effort 框架 | 更新日期: 2023-09-27 18:13:41
我正在尝试使用数据库编写测试,托管在Azure SQL中,在实体框架6上使用Effort框架。
当执行以下代码时,会抛出一个异常:
[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
EffortProviderConfiguration.RegisterProvider();
}
[TestMethod]
public void TestMethod1()
{
const string connectionString = "Data Source=***;Initial Catalog=my_catalog;User ID=user;Password=password;provider=System.Data.SqlClient";
IDataLoader loader = new EntityDataLoader(connectionString);
using (var ctx = new UsersDbContext(Effort.DbConnectionFactory.CreatePersistent("cool", loader)))
{
var usersCount = ctx.Users.Count();
}
}
Count()
执行时抛出异常:
Effort.Exceptions。当试图初始化Table表——> System时,未处理的异常。ArgumentException: Keyword not supported: 'data source'.
将EffortProviderConfiguration.RegisterProvider()
替换为app.config设置时抛出相同的异常。
当使用完全相同的连接字符串创建UsersDbContext
时,它成功并且数据是可访问的。此外,在没有连接字符串的情况下,使用Effort持久模式或瞬态模式创建上下文也可以很好地工作。
如何初始化与真实DB中的现有数据的连接?
如果你像我一样困惑为什么你必须给工作一个连接字符串(因为它是一个内存数据库,直接和你提供上下文连接),文档使它有点清晰,只是如果你需要使用数据库先行或模型先行的变体的实体框架,因为实体连接字符串提供了必要的信息,努力找到你的模型,这样就可以建立一个模式! !因此,您可以安全地用虚拟名称填充连接字符串的服务器/数据库/用户id/密码部分。
这也清楚地表明,自定义默认DbConnectionFactory方法仅适用于代码优先,这解释了我得到的前几个小时的错误…对于模型优先或数据库优先,您必须将实体连接注入到实体类中,如下所述。
一个有用的提示,因为生成实体模型类是部分类,您可以创建另一个代码文件在同一装配,给它相同的名称空间中,让它也部分类,您可以添加第二构造函数设置EntityConnection所需代码文件相反,这样当你修改/创建实体模型,定义构造函数的代码不会被删除的t4模板。
您指定的连接字符串格式错误。您正在使用ADO。. NET/Linq2SQL连接字符串格式EntityDataLoader需要符合EntityConnection(来自EntityFramework的类)的连接字符串。您可以在这里阅读EF的连接字符串:http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection.connectionstring(v=vs.110).aspx
简单来说,你的连接字符串应该是这样的:"Provider=System.Data.SqlClient;
Metadata=c:'metadata|c:'Metadata'Sql;
Provider Connection String='Data Source=localhost; Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=60' "
现在在你的代码中你只指定了提供者连接字符串部分。
我认为你的连接字符串必须是EF风格的连接字符串。例如在app.config或webconfig中:
<add name="dbConnectionString" connectionString="metadata=res://*/Models.YourEntityModel.csdl|res://*/Models.YourEntityModel.ssdl|res://*/Models.YourEntityModel.msl;provider=System.Data.SqlClient;provider connection string="data source=yourdatasource;initial catalog=yourdb;persist security info=True;user id=username;password=password;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
[TestMethod]
public void MyTestMethod()
{
//Arrange
//Then you can specify your connection string with its name:
EntityConnection connection =
Effort.EntityConnectionFactory.CreateTransient("name=dbConnectionString");
//Act
var usersCount;
using (MyDbContext ctx= new MyDbContext(connection))
{
usersCount = ctx.Users.Count();
}
//Assert
//Put your assert logic here:
Assert.IsTrue(usersCount == 100);
}