为何我的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
相关产品推荐
相关产品推荐

