我继承了这个项目的一些测试。他们在针对 SQL 数据库运行时正在工作,但速度很慢。我正在尝试切换到使用 Effort。
.NET4.5、EF6.2、努力 1.3.10。
我的单元测试有两个可能相关的问题。
我是否并行运行测试并不重要。
1)如果我一次运行不止一个,我会得到
保存或接受更改失败,因为多个“Center.Shared.Person”类型的实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和实体框架模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用“HasDatabaseGeneratedOption”流式 API 或“DatabaseGeneratedAttribute”进行 Code First 配置。---> System.InvalidOperationException:保存或接受更改失败,因为多个“Center.Shared.Person”类型的实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和实体框架模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用“HasDatabaseGeneratedOption”流式 API 或“DatabaseGeneratedAttribute”进行 Code First 配置。
因此,测试似乎没有正确隔离。
跟踪代码,我可以看到 CreateTransient 被调用,但它显然不够瞬态。
public DbConnection CreateConnection(string nameOrConnectionString)
{
lock (_lock)
{
if (_connection == null)
{
_connection = Effort.DbConnectionFactory.CreateTransient();
}
return _connection;
}
}
在 TestInitialize 例程中,我尝试重置数据库。
[TestInitialize]
public override void Initialize()
{
db.Database.Delete();
db.Database.CreateIfNotExists();
db.Database.Initialize(true);
这是非常复杂的代码,所以如果我们需要发布更多代码,我们需要很长时间才能找到兔子洞的底部。创建 PoC 可能更好。
2)如果我独立运行测试,我会遇到不同的问题。同样,这些通过了 SQL 但不是 Effort。
[TestMethod]
public void ClientAccessorTests_Find()
{
Client result;
Client client = new Client()
{
Complete = false,
HeadOfHousehold = true,
PersonID = _person.PersonID
};
_accessor.Create(client, _accessor.DefaultConnectionContext);
result = _accessor.Find(new object[] { client.ClientID }, _accessor.DefaultConnectionContext);
Assert.IsNotNull(result); // Fails with Assert.IsNotNull failed.
}
创建包括
public virtual EntityType Create(EntityType entity, ConnectionContext connectionContext)
{
IsContextValid(connectionContext);
if (entity == null) throw new ArgumentException("", "entity");
using (var db = CreateDbContext<DbContextType>(connectionContext))
{
db.Set<EntityType>().Add(entity);
db.SaveChanges();
}
return entity;
}
查找包括
public virtual EntityType Find(object[] primaryKey, ConnectionContext connectionContext)
{
IsContextValid(connectionContext);
if (primaryKey == null || primaryKey.Length == 0) throw new ArgumentException("", "primaryKey");
using (var db = CreateDbContext<DbContextType>(connectionContext))
{
return db.Set<EntityType>().Find(primaryKey);
}
}
我知道它正在调用 CreateDbContext,但跟踪代码,据我所知,它似乎是具有相同 ID 的同一个数据库。
是什么导致测试被隔离?
以及关于为什么 Find 在使用内存数据库时会停止工作的任何想法?