You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core Northwind测试遇System.MissingMethodException:找不到Xunit.Assert.Equal方法

问题原因

报错System.MissingMethodException是因为Xunit版本与Microsoft.EntityFrameworkCore.Relational.Specification.Tests包的依赖版本不兼容:

  • EF Core 8.0.14的TestSqlLoggerFactory.AssertBaseline()方法调用的是Xunit.Assert.Equal(string, string, bool, bool, bool)(带3个布尔参数的重载)
  • 你使用的Xunit 2.9.3中该方法签名的布尔参数数量不匹配,导致CLR无法找到对应的方法实现。
解决方案

方案1:对齐Xunit与EF Core测试包的版本

Microsoft.EntityFrameworkCore.Relational.Specification.Tests 8.0.14要求Xunit版本范围为>=2.6.4 && <3.0.0,你可以:

  • 将Xunit版本降级到2.8.1(EF Core 8官方测试用的稳定版本),确保版本在上述范围内,且无其他依赖强制引入冲突版本。
  • 在项目文件(.csproj)中明确锁定Xunit版本,避免隐式版本冲突:
<PackageReference Include="xunit" Version="2.8.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.1" PrivateAssets="all" />

方案2:自定义SQL断言逻辑

如果不想调整版本,可绕过EF Core的AssertSql方法,自行实现SQL语句的断言逻辑:

// 假设已获取实际执行的SQL语句列表
var actualSqlStatements = testSqlLoggerFactory.SqlStatements;
var expectedSql = "你的预期SQL语句";

// 自定义对比逻辑,忽略换行差异
foreach (var actualSql in actualSqlStatements)
{
    var normalizedActual = actualSql.Replace("\r\n", "\n").Trim();
    var normalizedExpected = expectedSql.Replace("\r\n", "\n").Trim();
    Assert.Equal(normalizedExpected, normalizedActual);
}

方案3:移除不必要的测试包引用

Microsoft.EntityFrameworkCore.Relational.Specification.Tests是EF Core自身的测试套件,并非外部项目编写测试的必需依赖。若你的测试不需要该包的其他功能,可直接移除它,改用EF Core官方推荐的Microsoft.EntityFrameworkCore.Testing包辅助测试,从根源避免版本冲突。

内容的提问来源于stack exchange,提问作者mn_test347

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:05:06