【问题标题】:How to assert with anonymous type result in unit testing web API?如何在单元测试 Web API 中使用匿名类型结果断言?
【发布时间】:2018-01-09 16:32:11
【问题描述】:

您好,我正在为我的控制器中的以下方法编写单元测试用例。

    [HttpGet]
    [Route("GetList")]
    public IHttpActionResult GetAllMasterList()
    {
        var MasterList = _masterListRepo.GetAll().Select(t => new { t.MASTER_ID, t.MASTER_NAME }).OrderBy(t=>t.MASTER_NAME).ToList();
        return Ok(MasterList);
    }

对于上述方法,单元测试用例方法如下。

    [TestMethod]
    public void AllMastersList()
    {
        //Arrange
        var controller = new MastersController();
        var actualResults = _masterListRepo.GetAll().ToList();

        //Act
        var actionResult = controller.GetAllMasterList();

        //Assert
        Assert.IsTrue(actionResult.GetType().GetGenericTypeDefinition() == typeof(OkNegotiatedContentResult<>));
        var contentExpected = actionResult as OkNegotiatedContentResult<IEnumerable<dynamic>>;
        Assert.IsNotNull(contentExpected.Content.ToList());
        Assert.AreEqual(contentExpected.Content.Count(), actualResults.Count);

    }

我得到contentExpectednull。如何转换此 Ok() 结果以获取值。怎么做?

【问题讨论】:

标签: c# unit-testing asp.net-web-api2 mstest


【解决方案1】:

我强烈建议不要返回匿名对象。 引入一个模型类将允许您轻松地对您的 api 调用进行单元测试。

public class Master {
    public string Id { get; set;}
    public string Name { get; set;}
}

var MasterList = _masterListRepo.GetAll().Select(t => new Master {Id = MASTER_ID, Name = t.MASTER_NAME).OrderBy(t=>t.MASTER_NAME).ToList();

此外,您不必从您的方法返回 IHttpActionResult,您可以只返回一个 IEnumerable,这也使您的测试方式更具可读性

var controller = new MastersController();
var actualResults = _masterListRepo.GetAll().ToList();

var resultsFromController = controller.GetAllMasterList(); //This is now an IEnumerable<Master>)

【讨论】:

  • 完全明白你的意思。但是必须有一些方法来测试这些方法。它返回匿名列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2012-04-24
  • 2013-08-03
相关资源
最近更新 更多