首页 > 解决方案 > ASP.NET Core 中返回 IEnumerable 的单元测试控制器逻辑在 JsonResult

问题描述

我有一个单元测试来验证控制器方法GetUser,我想调查resultsets是否有任何错误。

public void TestApiGetUser()
{
    GenericController controller = new GenericController();
    var result = controller.GetUser();
    result.ShouldNotBeNull();
    var resultObject = Assert.IsType<JsonResult>(result);
    var data = ((ActionResult<IEnumerable<Resultset>>)(JsonResult)result).Value as IEnumerable<Resultset>; //this is returning null
    //how to access data.Any(x => x.IsError) to test if there is any error in the API call?
}

控制器具有以下GetUser端点,如下所示:

[HttpPost]
[Route("User")]
public JsonResult GetUser()
{       
    var result = _apiOrchestrator.GetUserData();
    return Json(result);
}

GetUserData()看起来像:

public IEnumerable<Resultset> GetUserData()
{
    IEnumerable<Resultset> result = null;
    //Some code
    //Fill result object with user data
    return result;
}

Resultset对象如下所示:

public class Resultset
{
    public string Name { get; set; }
    public string Data { get; set; }
    public bool IsError { get; set; } = false;
    public List<string> ErrorMessages { get; set; }
}

我在这里阅读了很多文章,但没有看到任何对我有用的东西。任何帮助,将不胜感激。

UPDATE 2:如果我这样做:

var model = Assert.IsAssignableFrom<IEnumerable<Resultset>(resultObject.Value);
Assert.True(resultsets.Any(x=>x.IsError));

我想我得到了上面的代码。但是,这是最好的方法吗?

标签: .netunit-testingasp.net-core

解决方案


这比我想象的要简单。如果有人正在寻找他们试图评估IEnumerable<T>. 我相信还有其他方法,但这就是我的测试工作的原因。随意添加您的解决方案以供将来参考。

public void TestApiGetUser()
{
    GenericController controller = new GenericController();
    var result = controller.GetUser();
    var resultsets = Assert.IsAssignableFrom<IEnumerable<Resultset>>(result.Value);
    Assert.DoesNotContain(resultsets, x => x.IsError);
    Assert.DoesNotContain(resultsets, x => x.ErrorMessages.Count > 0);
}

推荐阅读