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

为何我的XUnit测试本该失败却始终通过?

单元测试校验Organisation名称唯一性失败排查

问题原因

你的单元测试失败核心问题在于Mock服务的设置不符合场景要求:

  • 当前mockOrganisationService的GetOrganisationByNameAsync被设置为无论传入什么名称,始终返回null,这模拟的是「名称不存在」的场景。
  • 两次调用IsValid时,Mock服务都返回“名称不存在”,所以两次校验都会通过,导致resultCopy.Valid始终为True,和你的断言预期冲突。

修复方案

需要让Mock服务模拟「第一次查询名称不存在,第二次查询名称已存在」的场景,可使用SetupSequence配置Mock的多调用返回值:

[Fact]
public async Task IsValid_ReturnsFalse_WhenNameAlreadyExists()
{
    // Arrange
    var input = new Organisation
    {
        Name = "TestClient",
        Id = "TestOrg"
    };
    var mockOrganisationService = new Mock<IOrganisationService>();
    // 配置Mock:第一次调用返回null(名称不存在),第二次返回已存在的Organisation实例
    mockOrganisationService
        .SetupSequence(x => x.GetOrganisationByNameAsync(It.IsAny<string>()))
        .ReturnsAsync((Organisation)null)
        .ReturnsAsync(new Organisation { Name = "TestClient", Id = "ExistingOrg" });
    var inputCopy = new Organisation
    {
        Name = "TestClient",
        Id = "TestOrg"
    };
    var myValidation = new ClientValidation(mockOrganisationService.Object);

    // Act
    var result = await myValidation.IsValid(input);
    var resultCopy = await myValidation.IsValid(inputCopy);

    // Assert
    Assert.True(result.Valid);
    Assert.False(resultCopy.Valid);
}

额外注意点

如果ClientValidation的校验逻辑包含「排除当前ID的组织」(比如编辑场景下,允许同名但同ID的组织通过),那么Mock返回的已存在Organisation实例需要设置与输入不同的Id,否则校验逻辑会判定为同一个组织,不会触发重复错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:01:00