C# 单元测试 - 实际:(null) 在带有 Moq 框架的 xUnit 中使用列表的结果
C# Unit Testing - Actual: (null) Result using List in xUnit with Moq Framework
美好的一天,
我是在 C# 中使用 xUnit 和 Moq 框架进行单元测试的新手。
我正在尝试测试一种方法,其中 returns 列出该方法负责从存储库中的可查询方法返回信息列表 class。
这是我的测试方法。
[Fact]
public void SelectInfoByName_InfoHasValue_ReturnInfoSelect()
{
var service = new Mock<ISearchInfoRepository>();
var selectInfo = new SelectInfoService(null, service.Object);
service.Setup(s => s.SearchInfoByName("info")).Returns(new List<Info>
{
new Info{ Name = "name1",InfoId = 1},
new Info{Name = "name2",InfoId = 2}
}.AsQueryable);
var expectedResult = new List<Info>
{
new Info{Name = "name1", InfoId = 1},
new Info{Name = "name2", InfoId = 2}
};
var result = selectInfo.SelectInfoByName("info").Result;
Assert.Equal(expectedResult, result);
}
这是我的SelectInfoByName
负责按名称返回信息列表
public async Task<IEnumerable<SearchSelect>> SelectInfoByName(string info)
{
var infoByName = searchInfoRepo.SearchInfoByName(info);
return await infoByName.Select(info => new SearchSelect
{
text = info.Name,
value = info.InfoId
}).ToListAsync();
}
最后,这是我的存储库或存储 class,它使用 EF 与数据库通信。
// storage or repo class
public IQueryable<Info> SearchInfoByName(string info)
{
return infoRepo.Info().Where(info => info.Name.Contains(name.Trim().ToLower()));
}
注意:从 .AsyncState
更改为 .Result
但实际值仍然是 null
提前谢谢你。
当您得到结果时,您需要 .AsyncState。
改为请求 .Result,以获得实际结果:
var result = selectInfo.SelectInfoByName("info").Result;
您会收到一条错误消息:
The source IQueryable doesn’t implement IAsyncEnumerable. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.
基于此 Blog post,他使用 Task.FromResult
解决了问题。所以你的服务代码应该是这样的:
public async Task<IEnumerable<SearchSelect>> SelectInfoByName(string info)
{
var infoByName = searchInfoRepo.SearchInfoByName(info);
return await Task.Result(infoByName.Select(info => new SearchSelect
{
text = info.Name,
value = info.InfoId
}).ToListAsync());
}
然后在你的任务方法中,尝试使用 Assert
计算长度而不是比较它们的值。
Assert.True(expectedResult.Count(), result.Count());
美好的一天,
我是在 C# 中使用 xUnit 和 Moq 框架进行单元测试的新手。
我正在尝试测试一种方法,其中 returns 列出该方法负责从存储库中的可查询方法返回信息列表 class。
这是我的测试方法。
[Fact]
public void SelectInfoByName_InfoHasValue_ReturnInfoSelect()
{
var service = new Mock<ISearchInfoRepository>();
var selectInfo = new SelectInfoService(null, service.Object);
service.Setup(s => s.SearchInfoByName("info")).Returns(new List<Info>
{
new Info{ Name = "name1",InfoId = 1},
new Info{Name = "name2",InfoId = 2}
}.AsQueryable);
var expectedResult = new List<Info>
{
new Info{Name = "name1", InfoId = 1},
new Info{Name = "name2", InfoId = 2}
};
var result = selectInfo.SelectInfoByName("info").Result;
Assert.Equal(expectedResult, result);
}
这是我的SelectInfoByName
负责按名称返回信息列表
public async Task<IEnumerable<SearchSelect>> SelectInfoByName(string info)
{
var infoByName = searchInfoRepo.SearchInfoByName(info);
return await infoByName.Select(info => new SearchSelect
{
text = info.Name,
value = info.InfoId
}).ToListAsync();
}
最后,这是我的存储库或存储 class,它使用 EF 与数据库通信。
// storage or repo class
public IQueryable<Info> SearchInfoByName(string info)
{
return infoRepo.Info().Where(info => info.Name.Contains(name.Trim().ToLower()));
}
注意:从 .AsyncState
更改为 .Result
但实际值仍然是 null
提前谢谢你。
当您得到结果时,您需要 .AsyncState。
改为请求 .Result,以获得实际结果:
var result = selectInfo.SelectInfoByName("info").Result;
您会收到一条错误消息:
The source IQueryable doesn’t implement IAsyncEnumerable. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.
基于此 Blog post,他使用 Task.FromResult
解决了问题。所以你的服务代码应该是这样的:
public async Task<IEnumerable<SearchSelect>> SelectInfoByName(string info)
{
var infoByName = searchInfoRepo.SearchInfoByName(info);
return await Task.Result(infoByName.Select(info => new SearchSelect
{
text = info.Name,
value = info.InfoId
}).ToListAsync());
}
然后在你的任务方法中,尝试使用 Assert
计算长度而不是比较它们的值。
Assert.True(expectedResult.Count(), result.Count());