SQLite集成测试中出现MissingMethodException异常求助
排查SQLite内存库集成测试的异常问题
先给你梳理几个核心问题点,按优先级来排查:
1. EF Core版本严重不匹配(最可能的根源)
看你的项目配置:
- DbContext类库(VSC.Repo)引用的是EF Core 7.0.2的全套组件(EntityFrameworkCore、SqlServer等)
- 测试项目里的
Microsoft.EntityFrameworkCore.Sqlite却还是6.0.13
EF Core的所有相关包版本必须严格统一,跨大版本的混用会导致大量兼容性错误,包括你遇到的这个NullReferenceException。
解决方案:
把测试项目里的Microsoft.EntityFrameworkCore.Sqlite版本升级到7.0.2,和类库保持一致:
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
2. MSTest包版本冲突
你的测试项目里重复引用了不同版本的MSTest组件:
- 既有
MSTest.TestFramework 3.0.2 - 又有
MSTest.TestFramework 2.1.1和MSTest.TestAdapter 2.1.1
版本不一致会导致测试运行时的加载异常,建议统一升级到最新稳定版,清理重复引用:
<ItemGroup> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.2" /> <!-- 同步升级到对应适配版本 --> <PackageReference Include="MSTest.TestAdapter" Version="3.0.2" /> <PackageReference Include="MSTest.TestFramework" Version="3.0.2" /> <PackageReference Include="coverlet.collector" Version="3.2.0" /> <!-- 可选升级到最新版 --> </ItemGroup>
3. SQLite内存库的连接优化(辅助排查)
虽然不是直接报错原因,但可以优化连接处理避免潜在问题:
- 在
SQLiteDatabaseContextFactory里,同步的EnsureCreated()可以改成异步的EnsureCreatedAsync(),和测试代码保持一致 - 确保内存库的连接在整个测试过程中始终处于打开状态(你目前的代码已经做到了,但要注意不要提前释放)
修改后的SQLiteDatabaseContextFactory异步版本示例:
public class SQLiteDatabaseContextFactory : IDisposable { private DbConnection _connection; private DbContextOptions<DataContext> CreateOptions() { return new DbContextOptionsBuilder<DataContext>() .UseSqlite(_connection).Options; } public async Task<DataContext> CreateContextAsync() { if (_connection == null) { _connection = new SqliteConnection("DataSource=:memory:"); await _connection.OpenAsync(); var options = CreateOptions(); using var context = new DataContext(options); await context.Database.EnsureCreatedAsync(); } return new DataContext(CreateOptions()); } public void Dispose() { if (_connection != null) { _connection.Dispose(); _connection = null; } } }
最后验证步骤
- 清理所有NuGet缓存(可以用
dotnet nuget locals all --clear命令) - 重新还原所有包(
dotnet restore) - 重新生成解决方案后再运行测试
先解决版本冲突的问题,这应该能直接修复你遇到的NullReferenceException。
内容的提问来源于stack exchange,提问作者Miguel Ferreira
相关产品推荐
相关产品推荐

