繁体   English   中英

C#单元测试 - 实际:(null)使用带有Moq Framework的xUnit中的List的结果

[英]C# Unit Testing - Actual: (null) Result using List in xUnit with Moq Framework

美好的一天,

我是C#中使用xUnit和Moq Framework进行单元测试的新手。

我正在尝试测试一个方法,其中它返回列表,该方法负责从存储库类中的Queryable方法返回信息列表。

这是我的测试方法。

[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();
}

最后,这是我的存储库或存储类,它使用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

先感谢您。

您将收到特定错误消息的错误:

The source IQueryable doesn't implement IAsyncEnumerable. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.

基于此博客文章 ,他使用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());

当你得到你的结果时,你要求.AsyncState。

请求.Result,以获得实际结果:

var result = selectInfo.SelectInfoByName("info").Result;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM