【问题标题】:Unit test controller logic in ASP.NET Core that returns IEnumerable<someobject> in JsonResultASP.NET Core 中的单元测试控制器逻辑在 JsonResult 中返回 IEnumerable<someobject>
【发布时间】:2021-07-16 20:38:28
【问题描述】:

我有一个单元测试来验证控制器方法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; }
}

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

UPDATE 2: 如果我这样做:

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

我想我在上面的代码中找到了某个地方。但是,这是最好的方法吗?

【问题讨论】:

  • 您正在使用默认构造函数(无参数)创建GenericController 的实例。在GetUser 中,您有以下代码:var result = _apiOrchestrator.GetUserData();。问:调试你的测试时_apiOrchestrator的值是多少?
  • 那是在构造函数中发起的,是一个有效的对象。而且,GenericController 确实将数据返回给单元测试。
  • 我用我认为可行的解决方案更新了我的帖子,但如果这是最好的解决方案,我需要一个建议。

标签: .net unit-testing asp.net-core


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2018-05-01
    • 2019-08-08
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多