【问题标题】:Cannot convert from 'Microsoft.AspNetCore.Mvc.ActionResult' to 'System.Collections.Generic.IEnumerable<string>'无法从“Microsoft.AspNetCore.Mvc.ActionResult”转换为“System.Collections.Generic.IEnumerable<string>”
【发布时间】:2018-08-14 08:07:53
【问题描述】:

我在控制器中有从客户端调用该方法的异步方法。我想在 foreach 循环中迭代这个方法,但得到错误:

*Cannot convert from 'Microsoft.AspNetCore.Mvc.ActionResult' to 'System.Collections.Generic.IEnumerable<string>'*

UnitTest.cs

[TestFixture]
    public class ClientUnitTests 
    {
        private MessagesController Controller = new MessagesController(null, null, null);

        [Test]
        public async Task Check_API_Links()
        {
            // Arrange
            List<IEnumerable<string>> reporteeList = new List<IEnumerable<string>>();

            var links = await Controller.GetLinks();
            reporteeList.Add(links); //Cannot convert from 'Microsoft.AspNetCore.Mvc.ActionResult' to 'System.Collections.Generic.IEnumerable<string>'
            foreach (var itemLink in reporteeList)
            {
                reporteeList.Add(itemLink);
            }

            // Assert
            Assert.IsNotNull(reporteeList);
            Assert.GreaterOrEqual(0, reporteeList.Count);
            Assert.IsInstanceOf<IEnumerable<string>>(reporteeList);
        }
}

Controller.cs

[HttpGet]
 public async Task<ActionResult> GetLinks()
 {
   var result = await _client.GetLinks();

    return Ok(result);
 }

Client.cs

public async Task<ActionResult<IEnumerable<string>>> GetLinks()
{
   // Some logic here, 
}

如何解决这个问题以在单元测试中迭代 GetLinks 方法?

谢谢。

【问题讨论】:

  • 你需要把它包装到 ActionResult 中

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


【解决方案1】:

假设 .NET Core 2.1

public async Task<ActionResult<IEnumerable<string>>> GetLinks()

或者不那么受欢迎的

public async Task<IActionResult> GetLinks()

【讨论】:

  • 我已更改并添加到客户端方法,但在 UnitTest 中出现相同的错误
【解决方案2】:

对于您的问题,您将ActionResult&lt;IEnumerable&lt;string&gt;&gt;OkList&lt;IEnumerable&lt;string&gt;&gt;IEnumerable&lt;string&gt; 一起嵌入。

对于您当前的设计,请尝试以下代码:

        List<IEnumerable<string>> reporteeList = new List<IEnumerable<string>>();
        var result = await controller.GetLinks();
        var links = ((ObjectResult)((ActionResult<IEnumerable<string>>)((ObjectResult)result).Value).Result).Value as IEnumerable<string>;
        reporteeList.Add(links);

但是,在我的选择中,您不应该使用嵌入对象。请检查以下设计是否符合您的要求。

Client.cs 返回IEnumerable&lt;string&gt; 而不是ActionResult&lt;IEnumerable&lt;string&gt;&gt;

public class Client
{
    public async Task<ActionResult<IEnumerable<string>>> GetLinks()
    {
        IEnumerable<string> links = new List<string>() {
            "L1","L2"
        };
        return new ObjectResult(links);
        // Some logic here, 
    }
    public async Task<IEnumerable<string>> GetLinks1()
    {
        IEnumerable<string> links = new List<string>() {
            "L1","L2"
        };
        return links;
        // Some logic here, 
    }
}

控制器

    public async Task<ActionResult> GetLinks1()
    {
        var result = await new Client().GetLinks1();
        return Ok(result);
    }

测试

        List<string> reporteeList1 = new List<string>();
        var result1 = await controller.GetLinks1();
        var links1 = result1 as ObjectResult;
        reporteeList1.AddRange((IEnumerable<string>)links1.Value);

【讨论】:

    【解决方案3】:

    测试

        [Fact]
        public async Task Get_WhenCalled_ReturnsAllItemsCount()
        {
               // Act
           
            var result = await _controller.GetLinks1();
            var okResult = result.Result as OkObjectResult;
    
            // Assert
            var items = Assert.IsType<List<string>>(okResult.Value);
            Assert.Equal(2, items.Count);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      相关资源
      最近更新 更多