【发布时间】:2019-06-18 11:55:35
【问题描述】:
我有一些奇怪的问题,每当我 Run all 测试时,我的一些测试都会失败,但是当我一个接一个地启动它们时,一切正常
这里的代码在播种 InMemoryDatabase 时失败
它必须在Permissions 表中添加一些Permissions,然后创建与权限具有多对多关系的Groups
基本上一个Group可以有多个权限,一个权限可以在多个组中使用
但问题是
.Single 抛出
序列包含多个元素
所有测试同时运行,但单独运行时一切正常
有什么想法吗?
public class Tests : IDisposable
{
private readonly Context _context;
public void Dispose()
{
_context.Database.EnsureDeleted();
}
public Tests()
{
var o = new DbContextOptionsBuilder<Context>();
o.UseInMemoryDatabase("testDb");
_context = new Context(o.Options);
_context.Database.EnsureDeleted();
_context.Database.EnsureCreated();
}
[Fact]
public async void myTest()
{
Initializer.InitializePermissions(_context);
Initializer.InitializeGroups(_context);
(...)
}
}
public static class Initializer
{
public static void InitializePermissions(Context context)
{
var permissionNames = new List<string>
{
"CanCreateNewProduct",
"CanRemoveProduct",
};
foreach (var permission in permissionNames)
{
context.Permissions.Add(new Permission(permission));
}
context.SaveChanges();
}
public static void InitializeGroups(Context context)
{
var groups = new Dictionary<string, List<string>>();
groups.add("Admin", new List<string>{"CanRemoveProduct"};
foreach (var group in groups)
{
foreach (var permissionName in group.Value)
{
var permission = context.Permissions.Single(x => x.Name == permissionName);
group.GroupPermissions.Add
(
new Many2Many
{
Group = group,
GroupId = group.Id,
Permission = permission,
PermissionId = permission.Id
}
);
}
context.Groups.Add(new Group(group.Key, permissions);
}
context.SaveChanges();
}
}
【问题讨论】:
-
听起来您的测试正在共享状态。每个测试都应该完全隔离,不依赖于外部或共享状态。也许不是使用单个
static内存结构,而是使用相同的结构但基于实例,并且每个测试都创建/使用/处置自己的实例?每个数据库也需要隔离,因此UseInMemoryDatabase("testDb")需要为每个测试提供单独的数据库名称。 -
将
UseInMemoryDatabase("testDb")更改为UseInMemoryDatabase(Guid.NewGuid().ToString());就足够了哦,谢谢!如果你愿意,那就把它写成答案,这样我就可以接受了
标签: c# visual-studio .net-core xunit visual-studio-2019