无法在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中的现有数据的连接?

无法在Effort框架的单元测试中使用现有数据库

如果你像我一样困惑为什么你必须给工作一个连接字符串(因为它是一个内存数据库,直接和你提供上下文连接),文档使它有点清晰,只是如果你需要使用数据库先行或模型先行的变体的实体框架,因为实体连接字符串提供了必要的信息,努力找到你的模型,这样就可以建立一个模式! !因此,您可以安全地用虚拟名称填充连接字符串的服务器/数据库/用户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=&quot;data source=yourdatasource;initial catalog=yourdb;persist security info=True;user id=username;password=password;multipleactiveresultsets=True;App=EntityFramework&quot;" 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);
}