xunit 从 2.4.2 升级至 2.9.3 之后,下面的代码中 SelectMany 编译报错
foreach (var options in TestDatabaseProviders.SelectMany(x => x.Select(y => (DbContextOptions<ConfigurationDbContext>) y)).ToList())
{
using (var context = new ConfigurationDbContext(options, StoreOptions))
context.Database.EnsureCreated();
}
错误信息如下
TheoryData<DbContextOptions<ConfigurationDbContext>>' does not contain a definition for 'SelectMany' ...
是 TheoryData<T>
与 TheoryData
实现的接口变更引起的
xunit 2.4.2 中
public class TheoryData<T> : TheoryData
{
}
public abstract class TheoryData : IEnumerable<object[]>
{ }
在 2.9.3 中
public class TheoryData<T> : TheoryData, IEnumerable<T>
{ }
public abstract class TheoryData : IReadOnlyCollection<object[]>
{ }
对应的代码变更:
将类型转换为 IReadOnlyCollection<object[]>
即可解决
foreach (var options in (TestDatabaseProviders as IReadOnlyCollection<object[]>).SelectMany(x => x.Select(y => (DbContextOptions<ConfigurationDbContext>) y)).ToList())
{
using (var context = new ConfigurationDbContext(options, StoreOptions))
context.Database.EnsureCreated();
}
更好的解决方法是将
public static readonly TheoryData<DbContextOptions<TDbContext>> TestDatabaseProviders;
改为
public static readonly IReadOnlyCollection<object[]> TestDatabaseProviders;