如何在Xunit中配置IDbAccessor模拟对象使其返回指定对象?
解决方法
从你的代码判断,你使用的是Moq模拟框架,要解决PostItem返回null的问题,核心是通过Setup方法为模拟对象配置指定返回值,具体操作如下:
1. 准备测试返回对象
先创建一个用于返回的Dog实例(或根据需求配置模拟的Dog对象):
// 直接创建实际Dog对象 var testDog = new Dog { Id = 1, Name = "TestDog" }; // 若需要模拟Dog对象,可这样配置 var testDogMock = CreateMock<Dog>(); testDogMock.Setup(d => d.Id).Returns(1); var testDog = testDogMock.Object;
2. 配置模拟IDbAccessor的返回值
因为PostItem是异步方法,需要用ReturnsAsync指定返回结果;如果是同步方法则用Returns:
var dbAccessorMock = CreateMock<IDbAccessor>(); // 配置:当PostItem接收任意Dog对象时,返回预设的testDog dbAccessorMock.Setup(x => x.PostItem(It.IsAny<Dog>())) .ReturnsAsync(testDog);
3. 修改后的完整测试代码
[Fact] public async Task TestDB_Accessor() { // 准备测试用的Dog对象 var testDog = new Dog { Id = 1, Name = "TestDog" }; // 创建并配置模拟的IDbAccessor var dbAccessorMock = CreateMock<IDbAccessor>(); dbAccessorMock.Setup(x => x.PostItem(It.IsAny<Dog>())) .ReturnsAsync(testDog); // 注意:要调用模拟对象的实例(.Object),而非Mock本身 var result = await dbAccessorMock.Object.PostItem(testDog); // 验证方法调用,并可校验返回值 dbAccessorMock.Verify(x => x.PostItem(It.IsAny<Dog>()), Times.Once); Assert.Equal(testDog, result); }
额外说明
- 你之前的代码错误直接调用了
dbAccessorMock.PostItem,正确做法是调用dbAccessorMock.Object获取模拟实例后再调用方法 - 可以精准匹配参数:比如不用
It.IsAny<Dog>(),而是用It.Is<Dog>(d => d.Name == "TestDog")来匹配特定条件的参数,让配置更贴合测试场景
内容的提问来源于stack exchange,提问作者HackerMan33453
相关产品推荐
相关产品推荐

